Fonction WinHttpWriteData (winhttp.h)
La fonction WinHttpWriteData écrit des données de requête sur un serveur HTTP.
Syntaxe
WINHTTPAPI BOOL WinHttpWriteData(
[in] HINTERNET hRequest,
[in] LPCVOID lpBuffer,
[in] DWORD dwNumberOfBytesToWrite,
[out] LPDWORD lpdwNumberOfBytesWritten
);
Paramètres
[in] hRequest
Handle HINTERNET valide retourné par WinHttpOpenRequest. Attendez que WinHttpSendRequest soit terminé avant d’appeler cette fonction.
[in] lpBuffer
Pointeur vers une mémoire tampon qui contient les données à envoyer au serveur. Assurez-vous que cette mémoire tampon reste valide jusqu’à la fin de WinHttpWriteData .
[in] dwNumberOfBytesToWrite
Valeur entière longue non signée qui contient le nombre d’octets à écrire dans le fichier.
[out] lpdwNumberOfBytesWritten
Pointeur vers une variable entière longue non signée qui reçoit le nombre d’octets écrits dans la mémoire tampon. La fonction WinHttpWriteData définit cette valeur sur zéro avant d’effectuer un travail ou une vérification des erreurs. Lors de l’utilisation asynchrone de WinHTTP, ce paramètre doit être défini sur NULL et récupérer les informations dans la fonction de rappel. Le fait de ne pas le faire peut provoquer une erreur de mémoire.
Valeur retournée
Retourne LA valeur TRUE si elle réussit ou FALSE dans le cas contraire. Pour obtenir des informations d’erreur étendues, appelez GetLastError. Parmi les codes d’erreur retournés, citons :
Code d'erreur | Description |
---|---|
|
La connexion au serveur a été réinitialisée ou terminée, ou un protocole SSL incompatible a été rencontré. Par exemple, WinHTTP version 5.1 ne prend pas en charge SSL2, sauf si le client l’active spécifiquement. |
|
L’opération demandée ne peut pas être effectuée, car le handle fourni n’est pas dans l’état correct. |
|
Le type de handle fourni est incorrect pour cette opération. |
|
Une erreur interne s'est produite. |
|
L’opération a été annulée, généralement parce que le handle sur lequel la demande fonctionnait a été fermé avant la fin de l’opération. |
|
Le délai d'attente de la requête a expiré. |
|
La mémoire disponible n’était pas suffisante pour effectuer l’opération demandée. (Code d’erreur Windows) |
Remarques
Même lorsque WinHTTP est utilisé en mode asynchrone (c’est-à-dire, lorsque WINHTTP_FLAG_ASYNC a été défini dans WinHttpOpen), cette fonction peut fonctionner de manière synchrone ou asynchrone. Si cette fonction retourne FALSE, vous pouvez appeler GetLastError pour obtenir des informations d’erreur étendues. Si cette fonction retourne TRUE, utilisez la WINHTTP_CALLBACK_STATUS_WRITE_COMPLETE complétion pour déterminer si cette fonction a réussi et la valeur des paramètres. La WINHTTP_CALLBACK_STATUS_REQUEST_ERROR’achèvement indique que l’opération s’est terminée de manière asynchrone, mais a échoué.
Si une fonction de rappel status a été installée avec WinHttpSetStatusCallback, celles des notifications suivantes qui ont été définies dans le paramètre dwNotificationFlags de WinHttpSetStatusCallback indiquent la progression de l’envoi de données au serveur :
- 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
Deuxièmement, NTLM et Negotiate peuvent nécessiter plusieurs liaisons pour terminer l’authentification, ce qui nécessite que les données soient re-POST’ed pour chaque étape d’authentification. Cela peut être très inefficace pour les chargements de données volumineux.
Pour contourner ces deux problèmes, une solution consiste à envoyer une demande de préchauffement idempotente telle que HEAD à l’authentification d’abord au V-dir, à gérer les défis d’authentification associés à cette demande, puis uniquement ensuite aux données POST. Tant que le même socket est réutilisé pour gérer la post’ing, aucun autre problème d’authentification ne doit être rencontré et toutes les données peuvent être chargées en même temps. Étant donné qu’un socket authentifié ne peut être réutilisé que pour les requêtes suivantes au sein de la même session, le post doit sortir dans le même socket tant que le socket n’est pas mis en pool avec des requêtes simultanées concurrentes.
Exemples
Cet exemple montre le code qui écrit des données sur un serveur HTTP. Le nom de serveur fourni dans l’exemple, www.wingtiptoys.com, est fictif et doit être remplacé par le nom d’un serveur pour lequel vous disposez d’un accès en écriture.
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);
Configuration requise
Client minimal pris en charge | Windows XP, Windows 2000 Professionnel avec SP3 [applications de bureau uniquement] |
Serveur minimal pris en charge | Windows Server 2003, Windows 2000 Server avec SP3 [applications de bureau uniquement] |
Plateforme cible | Windows |
En-tête | winhttp.h |
Bibliothèque | Winhttp.lib |
DLL | Winhttp.dll |
Composant redistribuable | WinHTTP 5.0 et Internet Explorer 5.01 ou version ultérieure sur Windows XP et Windows 2000. |