Idioma: HTML | XAML

Conectando-se usando Solicitação HTTP XML e IXMLHTTPRequest2 (aplicativos do Tempo de Execução do Windows em C++ e XAML)

Applies to Windows and Windows Phone

Use a Solicitação HTTP XML Estendida e a interface IXMLHTTPRequest2 para enviar solicitações HTTP GET e POST para um serviço Web usando C++ em um aplicativo do Tempo de Execução do Windows.A amostra de Solicitação HTTP XML 2 GET e a amostra de Solicitação HTTP XML 2 POST demonstram os recursos detalhados neste tópico.

Observação  Para fazer solicitações HTTP em um aplicativo do Tempo de Execução do Windows desenvolvido com C#, Visual Basic ou C++, consulte Conectando-se a um servidor HTTP usando Windows.Web.Http.HttpClient.

O IXMLHTTPRequest2 permite que os aplicativos sejam executados em um MTA (Multi-Threaded Apartment), uma exigência para executar sob o Tempo de Execução do Windows no Windows 8. A execução em um MTA significa que um thread com acesso a um objeto IXMLHTTPRequest2 não é bloqueado no processamento de solicitação ou resposta para outros objetos IXMLHTTPRequest2 em execução no mesmo apartment.

Esta interface também implementa um modelo de retorno de chamada para manipulação de evento. Como os métodos IXMLHTTPRequest2 só permitem chamadas de métodos assíncronos, para receber retornos de chamada completas, um aplicativo precisa passar um ponteiro para um objeto IXMLHTTPRequest2Callback quando ele chama primeiro IXMLHTTPRequest2::Open para criar uma solicitação de HTTP.

Para ter um conhecimento básico sobre padrões de solicitações HTTP, consulte RFC 2616.

Pré-requisitos

Os seguintes exemplos usam C++ e são baseados no Exemplo de solicitação XML HTTP 2 GET e no Exemplo de solicitação XML HTTP 2 POST. Para obter instruções sobre a criação de um aplicativo do Tempo de Execução do Windows em C++, consulte Criar seu primeiro aplicativo do Tempo de Execução do Windows em C++.

Para garantir que o aplicativo do Tempo de Execução do Windows esteja pronto para a rede, defina alguns recursos de rede no arquivo Package.appxmanifest do projeto. Para obter mais informações, consulte Como definir recursos de rede.

Definir recursos para permitir acesso à rede

  • Defina recursos de rede para seu aplicativo a fim de permitir o acesso a uma rede corporativa ou doméstica privada e à Internet. Para este aplicativo, é necessário habilitar os recursos de rede, pois o cliente está se conectando a serviços Web.

    A funcionalidade de Internet (Cliente) é necessária se o aplicativo precisa ser capaz de se conectar como um cliente a serviços web na Internet. A funcionalidade de Redes Privadas (Cliente e Servidor) é necessária se o aplicativo precisa ser capaz de se conectar como um cliente a serviços Web em uma rede doméstica ou corporativa.

    Observação  No Windows Phone, há apenas um recurso de rede, Internet (Cliente e Servidor), que permite o total acesso à rede do aplicativo.

    Se o aplicativo desejar acessar o serviço Web que estiver em execução no mesmo computador que o aplicativo, será necessário acesso loopback. Um aplicativo normalmente não tem acesso loopback por motivos de segurança. Entretanto, aplicativos desenvolvidos e executados no Visual Studio 2013 serão registrados automaticamente como isentos das restrições de loopback quando executados no depurador. Para saber mais, consulte Como habilitar o loopback e depurar o isolamento da rede.

    Para mais informações sobre acesso à rede, consulte Como configurar recursos de isolamento da rede.

    Estas etapas são necessárias para definir os recursos de rede de um aplicativo antes de ele ser implantado ou se ele acessar um serviço Web na Internet ou em uma rede privada ou corporativa.

  1. Use o Visual Studio 2013 para abrir o arquivo package.appxmanifest.
  2. Selecione a guia Recursos.
  3. Para criar a versão de exemplo do Windows, selecione os recursos Internet (Cliente) e Redes Privadas (Cliente e Servidor).

    Para criar a versão de exemplo do Windows Phone, selecione o recurso Internet (Cliente e Servidor).

  4. Salve e feche o arquivo de manifesto.

Criar e enviar uma solicitação GET

  1. Primeiro, crie as referências necessárias para esta operação, assim como o retorno de chamada que indica a conclusão da solicitação. O exemplo de solicitação XML HTTP 2 GET define suas próprias implementações de IXMLHTTPRequest2 e IXMLHTTPRequest2Callback, que são usadas na criação dos objetos operacionais necessários nos exemplos a seguir.

    
    HRESULT hr = S_OK;
    DWORD dwStatus = 0;
    BOOL fAbort = TRUE;
    ComPtr<IXMLHTTPRequest2> spXHR;
    ComPtr<CXMLHttpRequest2Callback> spXhrCallback;
    
    
  2. Crie e inicialize instâncias dos objetos IXMLHTTPRequest2 e IXMLHTTPRequest2Callback.

    
    
    //
    // Create and initialize an IXMLHTTPRequest2 object
    //
    hr = CoCreateInstance(CLSID_FreeThreadedXMLHTTP60,
                          NULL,
                          CLSCTX_INPROC_SERVER,
                          IID_PPV_ARGS(&spXHR));
    
    //
    //Create and initialize an IXMLHTTPRequest2Callback object
    //
    hr = MakeAndInitialize<CXMLHttpRequest2Callback>(&spXhrCallback);
    
    
    
  3. Configure a solicitação GET e envie-a para o servidor.

    
    
    hr = spXHR->Open(L"GET",              // Method.
                     pcwszUrl,            // Url.
                     spXhrCallback.Get(), // Callback.
                     NULL,                // Username.
                     NULL,                // Password.
                     NULL,                // Proxy username.
                     NULL);               // Proxy password.
    
    //
    //Send the GET request
    //
    hr = spXHR->Send(NULL, 0);
    
    
    
  4. Espere pelo término da solicitação.

    
    hr = spXhrCallback->WaitForComplete(&dwStatus);
    
    
    

    Observação  Os chamadores que precisarem receber eventos de status ou de conclusão em um STA ou thread de interface do usuário devem usar um mecanismo que não bloqueará o aparecimento de mensagens em janela de threads. Um exemplo é através da postagem de uma mensagem de janela para o STA ou para o identificador da janela de thread da interface do usuário.

Criar e enviar uma solicitação de POST

  1. Como o exemplo GET, primeiro criamos as referências necessárias para esta operação, assim como o retorno de chamada que indica a conclusão da solicitação. O exemplo de solicitação XML HTTP 2 POST define suas próprias implementações de IXMLHTTPRequest2 e IXMLHTTPRequest2Callback, que são usadas na criação dos objetos operacionais necessários nos exemplos a seguir. Entretanto, para a operação POST, precisamos criar o fluxo usado para a operação usando XMLHttpRequest2PostStream, uma implementação se ISequentialStream for definido para o exemplo. Alternativas para o uso de ISequentialStream para uma solicitação POST incluem SHCreateMemStream/SHCreateStreamOnFile para aplicativos da área de trabalho e CreateStreamOverRandomAccessStream para aplicativos do Tempo de Execução do Windows.

    Primeiro, crie as referências necessárias para esta operação, assim como o retorno de chamada que indica o progresso da solicitação. Também criamos e definimos variáveis usadas para representar o tamanho do arquivo a ser enviado e indicar a conclusão da solicitação.

    
    HRESULT hr = S_OK;
    DWORD dwStatus = 0;
    ULONGLONG ullFileSize = 0;
    BOOL fAbort = TRUE;
    ComPtr<IXMLHTTPRequest2> spXHR;
    ComPtr<CXMLHttpRequest2Callback> spXhrCallback;
    ComPtr<CXMLHttpRequestPostStream> spXhrPostStream;
    
    
  2. Crie e inicialize objetos das classes IID_IXMLHTTPRequest2, CXMLHTTPRequest2Callback e XMLHTTPRequestPostStream.

    
    //
    //Initialize IXMLHTTPRequest2Callback
    //
    hr = MakeAndInitialize<CXMLHttpRequest2Callback>(&spXhrCallback);
    if (FAILED(hr))
    {
        goto Exit;
    }
    
    //
    // Create an object of the CXMLHttpRequestPostStream class
    //
    spXhrPostStream = Make<CXMLHttpRequestPostStream>();
    if (spXhrPostStream == NULL)
    {
        hr = E_OUTOFMEMORY;
        goto Exit;
    }
    
    
  3. Abra o arquivo e pegue o tamanho.

    
    //
    //Open the file
    //
    hr = spXhrPostStream->Open(pcwszFileName);
    
    //
    //Get file size
    //
    hr = spXhrPostStream->GetSize(&ullFileSize);
    
    
    
  4. Prepare a solicitação de POST e envie-a para o servidor.

    
    //
    //Configure the POST request
    //
    hr = spXHR->Open(L"POST",             // Method.
                     pcwszUrl,            // Url.
                     spXhrCallback.Get(), // Callback.
                     NULL,                // Username.
                     NULL,                // Password.
                     NULL,                // Proxy username.
                     NULL);               // Proxy password.
    if (FAILED(hr))
    {
        goto Exit;
    }
    
    //
    //Send the POST request
    //
    hr = spXHR->Send(spXhrPostStream.Get(), ullFileSize);
    if (FAILED(hr))
    {
        goto Exit;
    }
    
    
  5. Espere pelo término da solicitação.

    
    hr = spXhrCallback->WaitForComplete(&dwStatus);
    if (FAILED(hr))
    {
        goto Exit;
    }
    
    fAbort = FALSE;
    
    

    Observação  Os chamadores que precisarem receber eventos de status ou de conclusão em um STA ou thread de interface do usuário devem usar um mecanismo que não bloqueará o aparecimento de mensagens em janela de threads. Um exemplo é através da postagem de uma mensagem de janela para o STA ou para o identificador da janela de thread da interface do usuário.

Resumo

Neste tópico, vimos como iniciar uma conexão de serviço Web com solicitações GET e POST usando a Solicitação HTTP XML Estendida e as interfaces IXMLHTTPRequest2 e IXMLHTTPRequest2Callback.

Tópicos relacionados

Outros recursos
Conectando-se a serviços Web
Resolvendo exceções em aplicativos de rede
Como configurar recursos de rede
Como habilitar loopback e depurar o isolamento de rede
Referência
Solicitação HTTP XML Estendida
IXMLHTTPRequest2
IXMLHTTPRequest2Callback
Solicitação HTTP XML Estendida (IXMLHTTPRequest2)
Exemplos
Exemplo de solicitação XML HTTP 2 GET
Exemplo de solicitação XML HTTP 2 POST

 

 

Mostrar:
© 2014 Microsoft