Fungsi WinHttpWriteData (winhttp.h)
Fungsi WinHttpWriteData menulis data permintaan ke server HTTP.
Sintaks
WINHTTPAPI BOOL WinHttpWriteData(
[in] HINTERNET hRequest,
[in] LPCVOID lpBuffer,
[in] DWORD dwNumberOfBytesToWrite,
[out] LPDWORD lpdwNumberOfBytesWritten
);
Parameter
[in] hRequest
Handel HINTERNET yang valid dikembalikan oleh WinHttpOpenRequest. Tunggu hingga WinHttpSendRequest selesai sebelum memanggil fungsi ini.
[in] lpBuffer
Penunjuk ke buffer yang berisi data yang akan dikirim ke server. Pastikan buffer ini tetap valid hingga setelah WinHttpWriteData selesai.
[in] dwNumberOfBytesToWrite
Nilai bilangan bulat panjang yang tidak ditandatangani yang berisi jumlah byte yang akan ditulis ke file.
[out] lpdwNumberOfBytesWritten
Penunjuk ke variabel bilangan bulat panjang yang tidak ditandatangani yang menerima jumlah byte yang ditulis ke buffer. Fungsi WinHttpWriteData mengatur nilai ini ke nol sebelum melakukan pemeriksaan kesalahan atau pekerjaan apa pun. Saat menggunakan WinHTTP secara asinkron, parameter ini harus diatur ke NULL dan mengambil informasi dalam fungsi panggilan balik. Tidak melakukannya dapat menyebabkan kesalahan memori.
Mengembalikan nilai
Mengembalikan TRUE jika berhasil, atau FALSE sebaliknya. Untuk informasi kesalahan yang diperluas, hubungi GetLastError. Di antara kode kesalahan yang dikembalikan adalah:
Kode Kesalahan | Deskripsi |
---|---|
|
Koneksi dengan server telah direset atau dihentikan, atau protokol SSL yang tidak kompatibel ditemukan. Misalnya, WinHTTP versi 5.1 tidak mendukung SSL2 kecuali klien secara khusus mengaktifkannya. |
|
Operasi yang diminta tidak dapat dilakukan karena handel yang diberikan tidak dalam keadaan benar. |
|
Jenis handel yang disediakan salah untuk operasi ini. |
|
Terjadi kesalah internal. |
|
Operasi dibatalkan, biasanya karena handel tempat permintaan beroperasi ditutup sebelum operasi selesai. |
|
Waktu permintaan habis. |
|
Tidak tersedia cukup memori untuk menyelesaikan operasi yang diminta. (Kode galat Windows) |
Keterangan
Bahkan ketika WinHTTP digunakan dalam mode asinkron (yaitu, ketika WINHTTP_FLAG_ASYNC telah diatur di WinHttpOpen), fungsi ini dapat beroperasi baik secara sinkron atau asinkron. Jika fungsi ini mengembalikan FALSE, Anda dapat memanggil GetLastError untuk mendapatkan informasi kesalahan yang diperluas. Jika fungsi ini mengembalikan TRUE, gunakan penyelesaian WINHTTP_CALLBACK_STATUS_WRITE_COMPLETE untuk menentukan apakah fungsi ini berhasil dan nilai parameter. Penyelesaian WINHTTP_CALLBACK_STATUS_REQUEST_ERROR menunjukkan bahwa operasi selesai secara asinkron, tetapi gagal.
Jika fungsi panggilan balik status telah diinstal dengan WinHttpSetStatusCallback, maka pemberitahuan berikut yang telah diatur dalam parameter dwNotificationFlags dari WinHttpSetStatusCallback menunjukkan kemajuan dalam mengirim data ke server:
- 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
Kedua, NTLM dan Negosiasi mungkin memerlukan beberapa jabat tangan untuk menyelesaikan autentikasi, yang mengharuskan data di-POST ulang untuk setiap kaki autentikasi. Ini bisa sangat tidak efisien untuk unggahan data besar.
Untuk mengatasi kedua masalah ini, salah satu solusinya adalah mengirim permintaan pemanasan idempoten seperti HEAD ke v-dir autentikasi terlebih dahulu, menangani tantangan autentikasi yang terkait dengan permintaan ini, dan hanya kemudian data POST. Selama soket yang sama digunakan kembali untuk menangani POST'ing, tidak ada tantangan autentikasi lebih lanjut yang harus dihadapi dan semua data dapat diunggah sekaligus. Karena soket yang diautentikasi hanya dapat digunakan kembali untuk permintaan berikutnya dalam sesi yang sama, POST harus keluar dalam soket yang sama selama soket tidak dikumpulkan dengan permintaan bersamaan yang bersaing untuk itu.
Contoh
Contoh ini menunjukkan kode yang menulis data ke server HTTP. Nama server yang disediakan dalam contoh, www.wingtiptoys.com, fiktif dan harus diganti dengan nama server tempat Anda memiliki akses tulis.
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);
Persyaratan
Klien minimum yang didukung | Windows XP, Windows 2000 Professional dengan SP3 [hanya aplikasi desktop] |
Server minimum yang didukung | Windows Server 2003, Windows 2000 Server dengan SP3 [hanya aplikasi desktop] |
Target Platform | Windows |
Header | winhttp.h |
Pustaka | Winhttp.lib |
DLL | Winhttp.dll |
Redistribusi | WinHTTP 5.0 dan Internet Explorer 5.01 atau yang lebih baru di Windows XP dan Windows 2000. |