Idioma: HTML | XAML

Procedimiento para conectarse mediante XML HTTP Request e IXMLHTTPRequest2 (aplicaciones de Windows en tiempo de ejecución con C++ y XAML)

Usa XML HTTP Extended Request y la interfaz IXMLHTTPRequest2 para enviar solicitudes HTTP GET y POST a un servicio web con C++ en una aplicación de Windows en tiempo de ejecución.En la muestra de XML HTTP Request 2 GET y la muestra de XML HTTP Request 2 POST se puede ver una demostración de las características que se detallan en este tema.

Nota  Para realizar solicitudes HTTP en una aplicación de Windows en tiempo de ejecución desarrollada con C#, Visual Basic o C++, consulta Conexión con un servidor HTTP mediante Windows.Web.Http.HttpClient.

IXMLHTTPRequest2 permite que las aplicaciones se ejecuten en un contenedor multiproceso (MTA), un requisito para que funcionen en Windows en tiempo de ejecución en Windows 8. La ejecución en un MTA significa que un subproceso que tiene acceso a un objeto IXMLHTTPRequest2 no bloquea el procesamiento de las solicitudes o respuestas de otros objetos IXMLHTTPRequest2 que se ejecutan en el mismo contenedor.

Esta interfaz también implementa un modelo de devolución de llamada para el control de eventos. Debido a que los métodos de IXMLHTTPRequest2 solo permiten llamadas a métodos asincrónicas, para que una aplicación reciba devoluciones de llamadas de finalización debe pasar un puntero a un objeto IXMLHTTPRequest2Callback cuando llama por primera vez a IXMLHTTPRequest2::Open para crear una solicitud HTTP.

Para obtener información básica sobre los patrones de solicitudes HTTP, consulta la especificación RFC 2616.

Requisitos previos

Los ejemplos siguientes usan C++ y se basan en la muestra de solicitudes GET de XML HTTP Request 2 y la muestra de solicitudes POST de XML HTTP Request 2. Si necesitas ayuda general para crear una aplicación de Windows en tiempo de ejecución con C++, consulta Crear la primera aplicación de Windows en tiempo de ejecución con C++.

Para asegurarte de que la aplicación de Windows en tiempo de ejecución está lista para la red, debes establecer las capacidades de red necesarias en el archivo Package.appxmanifest del proyecto. Para obtener más información, consulta Cómo establecer las funcionalidades de red.

Establecer las funcionalidades para habilitar el acceso de red

  • Establece las funcionalidades de red para tu aplicación para habilitar el acceso a una red privada doméstica o de trabajo, y a Internet. Para esta aplicación, tendrías que habilitar las funcionalidades de red porque el cliente se va a conectar a servicios web.

    Se necesita la funcionalidad Internet (cliente) si la aplicación debe poder conectarse como un cliente a servicios web en Internet. Se necesita la funcionalidad Redes privadas (cliente y servidor) si la aplicación debe poder conectarse como un cliente a servicios web en una red doméstica o red de trabajo.

    Nota  En Windows Phone, solo hay una funcionalidad de red, Internet (cliente y servidor), que habilita todo el acceso a redes para la aplicación.

    Si una aplicación desea acceder al servicio web que se ejecuta en el mismo equipo que la aplicación, se requerirá acceso de bucle invertido. Normalmente, por razones de seguridad, no se permite el acceso de bucle invertido de una aplicación. Sin embargo, las aplicaciones que se desarrollen y ejecuten en Microsoft Visual Studio 2013 se registrarán automáticamente como exentas de las restricciones de bucle invertido cuando se ejecuten en el depurador. Para obtener más información, consulta Cómo habilitar el aislamiento de red de bucle invertido y de depuración.

    Si quieres obtener información más detallada acerca del acceso de red, consulta Cómo configurar las funcionalidades de aislamiento de red.

    Estos pasos son necesarios para establecer las funcionalidades de red de una aplicación antes de que se implemente y si la aplicación accede a un servicio web en Internet o en una red privada o de trabajo.

  1. Usa Visual Studio 2013 para abrir el archivo package.appxmanifest.
  2. Selecciona la pestaña Funcionalidad.
  3. Para compilar la versión para Windows de la muestra, selecciona las funcionalidades Internet (cliente) y Redes privadas (cliente y servidor).

    Para compilar la versión para Windows Phone de la muestra, selecciona la funcionalidad Internet (cliente y servidor).

  4. Guarda y cierra el archivo de manifiesto.

Crear y enviar una solicitud GET

  1. Primero, crea las referencias necesarias para esta operación, así como la devolución de llamada que indica la finalización de la solicitud. La muestra de XML HTTP Request 2 GET define sus propias implementaciones de IXMLHTTPRequest2 y IXMLHTTPRequest2Callback, que se usan en la creación de los objetos operativos requeridos en los siguientes ejemplos.

    
    HRESULT hr = S_OK;
    DWORD dwStatus = 0;
    BOOL fAbort = TRUE;
    ComPtr<IXMLHTTPRequest2> spXHR;
    ComPtr<CXMLHttpRequest2Callback> spXhrCallback;
    
    
  2. Crea e inicializa instancias de los objetos IXMLHTTPRequest2 y 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. Configura la solicitud GET y envíala al 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. Espera que finalice la solicitud.

    
    hr = spXhrCallback->WaitForComplete(&dwStatus);
    
    
    
    Nota  Los llamadores que necesitan recibir eventos de finalización o de estado en un STA o subproceso de interfaz de usuario deben usar un mecanismo que no bloquee el bombeo de mensajes de la ventana de subprocesos. Un ejemplo sería la publicación de un mensaje de ventana en el controlador de ventana del STA o del subproceso de interfaz de usuario.

Crear y enviar una solicitud POST

  1. Como en el ejemplo de la solicitud GET, primero creamos las referencias necesarias para esta operación, así como la devolución de llamada que indica la finalización de la solicitud. La muestra de XML HTTP Request 2 POST también define sus propias implementaciones de IXMLHTTPRequest2 y IXMLHTTPRequest2Callback, que se usan en la creación de los objetos operativos requeridos en los siguientes ejemplos. Sin embargo, en el caso de la operación POST, tendremos que crear el flujo usado para la operación con XMLHttpRequest2PostStream, una implementación de ISequentialStream definida para la muestra. Entre las alternativas al uso de ISequentialStream para una solicitud POST, se incluyen SHCreateMemStream/SHCreateStreamOnFile para aplicaciones de escritorio y CreateStreamOverRandomAccessStream para aplicaciones de Windows en tiempo de ejecución.

    Primero, crea las referencias necesarias para esta operación, así como la devolución de llamada que indica el progreso de la solicitud. También hemos creado y definido variables que se usan para representar el tamaño del archivo que se enviará y para indicar la finalización de la solicitud.

    
    HRESULT hr = S_OK;
    DWORD dwStatus = 0;
    ULONGLONG ullFileSize = 0;
    BOOL fAbort = TRUE;
    ComPtr<IXMLHTTPRequest2> spXHR;
    ComPtr<CXMLHttpRequest2Callback> spXhrCallback;
    ComPtr<CXMLHttpRequestPostStream> spXhrPostStream;
    
    
  2. Crea e inicializa objetos de las clases IID_IXMLHTTPRequest2, CXMLHTTPRequest2Callback y 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. Abre el archivo y obtén el tamaño.

    
    //
    //Open the file
    //
    hr = spXhrPostStream->Open(pcwszFileName);
    
    //
    //Get file size
    //
    hr = spXhrPostStream->GetSize(&ullFileSize);
    
    
    
  4. Prepara la solicitud POST y envíala al 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. Espera que finalice la solicitud.

    
    hr = spXhrCallback->WaitForComplete(&dwStatus);
    if (FAILED(hr))
    {
        goto Exit;
    }
    
    fAbort = FALSE;
    
    
    Nota  Los llamadores que necesitan recibir eventos de finalización o de estado en un STA o subproceso de interfaz de usuario deben usar un mecanismo que no bloquee el bombeo de mensajes de la ventana de subprocesos. Un ejemplo sería la publicación de un mensaje de ventana en el controlador de ventana del STA o del subproceso de interfaz de usuario.

Resumen

En este tema hemos revisado cómo iniciar una conexión a un servicio web con solicitudes GET y POST mediante XML HTTP Extended Request y las interfaces IXMLHTTPRequest2 y IXMLHTTPRequest2Callback.

Temas relacionados

Otros recursos
Conexión a servicios web
Controlar excepciones en aplicaciones de red
Cómo configurar las funcionalidades de red
Cómo habilitar el bucle invertido y depurar el aislamiento de red
Referencia
XML HTTP Extended Request
IXMLHTTPRequest2
IXMLHTTPRequest2Callback
XML HTTP Extended Request (IXMLHTTPRequest2)
Muestras
Muestra de solicitudes GET de XML HTTP Request 2
Muestra de solicitudes POST de XML HTTP Request 2

 

 

Mostrar:
© 2015 Microsoft