Share via


Sesiones HTTP

WinINet le permite acceder a los recursos de World Wide Web (WWW). Se puede acceder a estos recursos directamente mediante InternetOpenUrl (para obtener más información, consulte Acceso a direcciones URL directamente).

Se accede a los recursos en www mediante http. Las funciones HTTP controlan los protocolos subyacentes, a la vez que permiten a la aplicación acceder a información sobre www. A medida que evoluciona el protocolo HTTP, los protocolos subyacentes se actualizan para mantener el comportamiento de la función.

En el diagrama siguiente se muestran las relaciones de las funciones que se usan con el protocolo HTTP. Los cuadros sombreados representan funciones que devuelven identificadores HINTERNET , mientras que los cuadros sin formato representan funciones que usan el identificador HINTERNET creado por la función en la que dependen.

Funciones wininet usadas para http

Para obtener más información, vea HINTERNET Handles( Identificadores hinternet).

Uso de las funciones winINet para acceder a WWW

Las siguientes funciones se usan durante las sesiones HTTP para acceder a www.

Función Descripción
HttpAddRequestHeaders Agrega encabezados de solicitud HTTP al identificador de solicitud HTTP. Esta función requiere un identificador creado por HttpOpenRequest.
HttpOpenRequest Abre un identificador de solicitud HTTP. Esta función requiere un identificador creado por InternetConnect.
HttpQueryInfo Consulta información sobre una solicitud HTTP. Esta función requiere un identificador creado por la función HttpOpenRequest o InternetOpenUrl .
HttpSendRequest Envía la solicitud HTTP especificada al servidor HTTP. Esta función requiere un identificador creado por HttpOpenRequest.
InternetErrorDlg Muestra cuadros de diálogo predefinidos para las condiciones comunes de error de Internet. Esta función requiere el identificador usado en la llamada a HttpSendRequest.

 

Iniciar una conexión a www

Para iniciar una conexión a WWW, la aplicación debe llamar a la función InternetConnect en la raíz HINTERNET devuelta por InternetOpen. InternetConnect debe establecer una sesión HTTP declarando el tipo de servicio INTERNET_SERVICE_HTTP. Para obtener más información sobre el uso de InternetConnect, consulte Uso de InternetConnect.

Abrir una solicitud

La función HttpOpenRequest abre una solicitud HTTP y devuelve un identificador HINTERNET que las demás funciones HTTP pueden usar. A diferencia de las otras funciones abiertas (como FtpOpenFile e InternetOpenUrl), HttpOpenRequest no envía la solicitud a Internet cuando se llama a . La función HttpSendRequest envía la solicitud y establece una conexión a través de la red.

HttpOpenRequest toma un identificador de sesión HTTP creado por InternetConnect y un verbo HTTP, nombre de objeto, cadena de versión, referencia, tipos de aceptación, marcas y valor de contexto.

El verbo HTTP es una cadena que se usará en la solicitud. Los verbos HTTP comunes que se usan en las solicitudes incluyen GET, PUT y POST. Si este valor se establece en NULL, HttpOpenRequest usa el valor predeterminado GET.

El nombre del objeto es una cadena que contiene el nombre del objeto de destino del verbo HTTP especificado. Por lo general, se trata de un nombre de archivo, un módulo ejecutable o un especificador de búsqueda. Si el nombre de objeto proporcionado es una cadena vacía, HttpOpenRequest busca la página predeterminada.

La cadena de versión debe contener la versión HTTP. Si este parámetro es NULL, la función usa ""HTTP/1.1"".

El remitente especifica la dirección del documento a partir del cual se obtuvo el nombre del objeto. Si este parámetro es NULL, no se especifica ningún remitente.

La cadena terminada en null que contiene los tipos de aceptación indica los tipos de contenido aceptados por la aplicación. Establecer este parámetro en NULL indica que la aplicación no acepta ningún tipo de contenido. Si se proporciona una cadena vacía, la aplicación indica que solo acepta documentos de tipo ""text/*"". El valor ""text/*"" indica documentos de solo texto, no imágenes u otros archivos binarios.

Los valores de marca controlan el almacenamiento en caché, las cookies y los problemas de seguridad. Para Microsoft Network (MSN), NTLM y otros tipos de autenticación, establezca la marca INTERNET_FLAG_KEEP_CONNECTION .

Si la marca INTERNET_FLAG_ASYNC se estableció en la llamada a InternetOpen, se debe establecer un valor de contexto distinto de cero para una operación asincrónica adecuada.

El ejemplo siguiente es una llamada de ejemplo a HttpOpenRequest.

hHttpRequest = HttpOpenRequest( hHttpSession, "GET", "", NULL, "", NULL, 0, 0);

Agregar encabezados de solicitud

La función HttpAddRequestHeaders permite a las aplicaciones agregar uno o varios encabezados de solicitud a la solicitud inicial. Esta función permite a una aplicación anexar encabezados de formato libre adicionales al identificador de solicitud HTTP; está diseñado para su uso por aplicaciones sofisticadas que requieren un control preciso sobre la solicitud enviada al servidor HTTP.

HttpAddRequestHeaders necesita un identificador de solicitud HTTP creado por HttpOpenRequest, una cadena que contiene los encabezados, la longitud de los encabezados y los modificadores.

Envío de una solicitud

HttpSendRequest establece una conexión a Internet y envía la solicitud al sitio especificado. Esta función requiere un identificador HINTERNET creado por HttpOpenRequest. HttpSendRequest también puede enviar encabezados adicionales o información opcional. La información opcional se usa generalmente para las operaciones que escriben información en el servidor, como PUT y POST.

Una vez que HttpSendRequest envía la solicitud, la aplicación puede usar las funciones InternetReadFile, InternetQueryDataAvailable e InternetSetFilePointer en el identificador HINTERNET creado por HttpOpenRequest para descargar los recursos del servidor.

Publicar datos en el servidor

Para publicar datos en un servidor, el verbo HTTP de la llamada a HttpOpenRequest debe ser POST o PUT. La dirección del búfer que contiene los datos POST debe pasarse al parámetro lpOptional en HttpSendRequest. El parámetro dwOptionalLength debe establecerse en el tamaño de los datos.

También puede usar la función InternetWriteFile para publicar datos en un identificador HINTERNET enviado mediante HttpSendRequestEx.

Obtener información sobre una solicitud

HttpQueryInfo permite a una aplicación recuperar información sobre una solicitud HTTP. La función requiere un identificador HINTERNET creado por HttpOpenRequest o InternetOpenUrl, un valor de nivel de información y una longitud del búfer. HttpQueryInfo también acepta un búfer que almacena la información y un índice de encabezado basado en cero que enumera varios encabezados con el mismo nombre.

Descarga de recursos desde www

Después de abrir una solicitud con HttpOpenRequest y enviarlo al servidor con HttpSendRequest, la aplicación puede usar las funciones InternetReadFile, InternetQueryDataAvailable e InternetSetFilePointer para descargar el recurso desde el servidor HTTP.

En el ejemplo siguiente se descarga un recurso. La función acepta el identificador de la ventana actual, el número de identificación de un cuadro de edición y un identificador HINTERNET creado por HttpOpenRequest y enviado por HttpSendRequest. Usa InternetQueryDataAvailable para determinar el tamaño del recurso y, a continuación, lo descarga mediante InternetReadFile. A continuación, el contenido se muestra en el cuadro de edición.

int WINAPI Dumper(HWND hX, int intCtrlID, HINTERNET hResource)
{
    LPTSTR lpszData;    // buffer for the data
    DWORD  dwSize;       // size of the data available
    DWORD  dwDownloaded; // size of the downloaded data
    DWORD  dwSizeSum=0;  // size of the data in the textbox
    LPTSTR lpszHolding;  // buffer to merge the textbox data and buffer

    // Set the cursor to an hourglass.
    SetCursor(LoadCursor(NULL,IDC_WAIT));

    // This loop handles reading the data.
    do
    {
        // The call to InternetQueryDataAvailable determines the
        // amount of data available to download.
        if (!InternetQueryDataAvailable(hResource,&dwSize,0,0))
        {
            printf("InternetQueryDataAvailable failed (%d)\n", GetLastError());
            SetCursor(LoadCursor(NULL,IDC_ARROW));
            return FALSE;
        }
        else
        {
            // Allocate a buffer of the size returned by
            // InternetQueryDataAvailable.
            lpszData = new TCHAR[dwSize+1];

            // Read the data from the HINTERNET handle.
            if(!InternetReadFile(hResource,
                                 (LPVOID)lpszData,
                                 dwSize,
                                 &dwDownloaded))
            {
                printf("InternetReadFile failed (%d)\n", GetLastError());
                delete[] lpszData;
                break;
            }
            else
            {
                // Add a null terminator to the end of the data buffer
                lpszData[dwDownloaded]='\0';

                // Allocate the holding buffer.
                lpszHolding = new TCHAR[dwSizeSum + dwDownloaded + 1];

                // Check if there has been any data written
                // to the textbox.
                if (dwSizeSum != 0)
                {
                    // Retrieve the data stored in the textbox if any
                    GetDlgItemText(hX,intCtrlID,
                                   (LPTSTR)lpszHolding,
                                   dwSizeSum);

                    // Add a null terminator at the end of the
                    // textbox data.
                    lpszHolding[dwSizeSum]='\0';
                }
                else
                {
                    // Make the holding buffer an empty string.
                    lpszHolding[0]='\0';
                }

                size_t cchDest = dwSizeSum + dwDownloaded + dwDownloaded + 1;
                LPTSTR* ppszDestEnd = 0;
                size_t* pcchRemaining = 0;

                // Add the new data to the holding buffer
                HRESULT hr = StringCchCatEx(lpszHolding,
                                            cchDest,
                                            lpszData,
                                            ppszDestEnd,
                                            pcchRemaining,
                                            STRSAFE_NO_TRUNCATION);

                if(SUCCEEDED(hr))
                {
                    // Write the holding buffer to the textbox.
                    SetDlgItemText(hX,intCtrlID,(LPTSTR)lpszHolding);

                    // Delete the two buffers.
                    delete[] lpszHolding;
                    delete[] lpszData;

                    // Add the size of the downloaded data to the
                    // textbox data size.
                    dwSizeSum = dwSizeSum + dwDownloaded + 1;

                    // Check the size of the remaining data.
                    // If it is zero, break.
                    if (dwDownloaded == 0)
                        break;
                    else
                    {
                    //  TODO: Insert error handling code here.
                    }
                }
            }
        }
    }
    while(TRUE);

    // Close the HINTERNET handle.
    InternetCloseHandle(hResource);

    // Set the cursor back to an arrow.
    SetCursor(LoadCursor(NULL,IDC_ARROW));

    return TRUE;
}

Nota

WinINet no admite implementaciones de servidor. Además, no se debe usar desde un servicio. En el caso de las implementaciones de servidor o los servicios, use Servicios HTTP de Microsoft Windows (WinHTTP).