Función WinHttpWriteData (winhttp.h)
La función WinHttpWriteData escribe datos de solicitud en un servidor HTTP.
Sintaxis
WINHTTPAPI BOOL WinHttpWriteData(
[in] HINTERNET hRequest,
[in] LPCVOID lpBuffer,
[in] DWORD dwNumberOfBytesToWrite,
[out] LPDWORD lpdwNumberOfBytesWritten
);
Parámetros
[in] hRequest
Identificador HINTERNET válido devuelto por WinHttpOpenRequest. Espere hasta que WinHttpSendRequest se haya completado antes de llamar a esta función.
[in] lpBuffer
Puntero a un búfer que contiene los datos que se van a enviar al servidor. Asegúrese de que este búfer permanece válido hasta que WinHttpWriteData se complete.
[in] dwNumberOfBytesToWrite
Valor entero largo sin signo que contiene el número de bytes que se van a escribir en el archivo.
[out] lpdwNumberOfBytesWritten
Puntero a una variable de entero largo sin signo que recibe el número de bytes escritos en el búfer. La función WinHttpWriteData establece este valor en cero antes de realizar cualquier comprobación de errores o trabajo. Cuando se usa WinHTTP de forma asincrónica, este parámetro debe establecerse en NULL y recuperar la información de la función de devolución de llamada. Si no lo hace, se puede producir un error de memoria.
Valor devuelto
Devuelve TRUE si se ejecuta correctamente o FALSE de lo contrario. Para obtener información de error extendida, llame a GetLastError. Entre los códigos de error devueltos se encuentran:
Código de error | Descripción |
---|---|
|
Se ha restablecido o finalizado la conexión con el servidor, o se encontró un protocolo SSL incompatible. Por ejemplo, WinHTTP versión 5.1 no admite SSL2 a menos que el cliente lo habilite específicamente. |
|
No se puede llevar a cabo la operación solicitada porque el identificador proporcionado no está en el estado correcto. |
|
El tipo de identificador proporcionado es incorrecto para esta operación. |
|
Se ha producido un error interno. |
|
La operación se canceló, normalmente porque el identificador en el que estaba funcionando la solicitud se cerró antes de que se completara la operación. |
|
La solicitud ha agotado el tiempo de espera. |
|
No había suficiente memoria disponible para completar la operación solicitada. (Código de error de Windows) |
Comentarios
Incluso cuando WinHTTP se usa en modo asincrónico (es decir, cuando se ha establecido WINHTTP_FLAG_ASYNC en WinHttpOpen), esta función puede funcionar de forma sincrónica o asincrónica. Si esta función devuelve FALSE, puede llamar a GetLastError para obtener información de error extendida. Si esta función devuelve TRUE, use el WINHTTP_CALLBACK_STATUS_WRITE_COMPLETE finalización para determinar si esta función se realizó correctamente y el valor de los parámetros. La finalización del WINHTTP_CALLBACK_STATUS_REQUEST_ERROR indica que la operación se completó de forma asincrónica, pero no se pudo realizar.
Si se ha instalado una función de devolución de llamada de estado con WinHttpSetStatusCallback, las de las siguientes notificaciones que se han establecido en el parámetro dwNotificationFlags de WinHttpSetStatusCallback indican el progreso en el envío de datos al servidor:
- WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE
- WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED
- WINHTTP_CALLBACK_STATUS_DATA_WRITTEN
- WINHTTP_CALLBACK_STATUS_SENDING_REQUEST
- WINHTTP_CALLBACK_STATUS_REQUEST_SENT
- WINHTTP_CALLBACK_STATUS_WRITE_COMPLETE
En segundo lugar, NTLM y Negotiate pueden requerir varios protocolos de enlace para completar la autenticación, lo que requiere que los datos se vuelvan a publicar para cada segmento de autenticación. Esto puede ser muy ineficaz para cargas de datos de gran tamaño.
Para solucionar estos dos problemas, una solución consiste en enviar una solicitud de preparación idempotente, como HEAD a la autenticación v-dir primero, controlar los desafíos de autenticación asociados a esta solicitud y, a continuación, solo los datos POST. Siempre que se vuelva a usar el mismo socket para controlar el post'ing, no se deben encontrar más desafíos de autenticación y se pueden cargar todos los datos a la vez. Puesto que un socket autenticado solo se puede reutilizar para las solicitudes posteriores dentro de la misma sesión, POST debe salir en el mismo socket siempre que el socket no esté agrupado con solicitudes simultáneas que compiten por él.
Ejemplos
En este ejemplo se muestra el código que escribe datos en un servidor HTTP. El nombre del servidor proporcionado en el ejemplo, www.wingtiptoys.com, es ficticio y debe reemplazarse por el nombre de un servidor para el que tiene acceso de escritura.
PCSTR pszData = "WinHttpWriteData Example";
DWORD dwBytesWritten = 0;
BOOL bResults = FALSE;
HINTERNET hSession = NULL,
hConnect = NULL,
hRequest = NULL;
// Use WinHttpOpen to obtain a session handle.
hSession = WinHttpOpen( L"A WinHTTP Example Program/1.0",
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
WINHTTP_NO_PROXY_NAME,
WINHTTP_NO_PROXY_BYPASS, 0);
// Specify an HTTP server.
if (hSession)
hConnect = WinHttpConnect( hSession, L"www.wingtiptoys.com",
INTERNET_DEFAULT_HTTP_PORT, 0);
// Create an HTTP Request handle.
if (hConnect)
hRequest = WinHttpOpenRequest( hConnect, L"PUT",
L"/writetst.txt",
NULL, WINHTTP_NO_REFERER,
WINHTTP_DEFAULT_ACCEPT_TYPES,
0);
// Send a Request.
if (hRequest)
bResults = WinHttpSendRequest( hRequest,
WINHTTP_NO_ADDITIONAL_HEADERS,
0, WINHTTP_NO_REQUEST_DATA, 0,
(DWORD)strlen(pszData), 0);
// Write data to the server.
if (bResults)
bResults = WinHttpWriteData( hRequest, pszData,
(DWORD)strlen(pszData),
&dwBytesWritten);
// End the request.
if (bResults)
bResults = WinHttpReceiveResponse( hRequest, NULL);
// Report any errors.
if (!bResults)
printf("Error %d has occurred.\n",GetLastError());
// Close any open handles.
if (hRequest) WinHttpCloseHandle(hRequest);
if (hConnect) WinHttpCloseHandle(hConnect);
if (hSession) WinHttpCloseHandle(hSession);
Requisitos
Cliente mínimo compatible | Windows XP, Windows 2000 Professional con SP3 [solo aplicaciones de escritorio] |
Servidor mínimo compatible | Windows Server 2003, Windows 2000 Server con SP3 [solo aplicaciones de escritorio] |
Plataforma de destino | Windows |
Encabezado | winhttp.h |
Library | Winhttp.lib |
Archivo DLL | Winhttp.dll |
Redistribuible | WinHTTP 5.0 e Internet Explorer 5.01 o posterior en Windows XP y Windows 2000. |