Bagikan melalui


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
ERROR_WINHTTP_CONNECTION_ERROR
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.
ERROR_WINHTTP_INCORRECT_HANDLE_STATE
Operasi yang diminta tidak dapat dilakukan karena handel yang diberikan tidak dalam keadaan benar.
ERROR_WINHTTP_INCORRECT_HANDLE_TYPE
Jenis handel yang disediakan salah untuk operasi ini.
ERROR_WINHTTP_INTERNAL_ERROR
Terjadi kesalah internal.
ERROR_WINHTTP_OPERATION_CANCELLED
Operasi dibatalkan, biasanya karena handel tempat permintaan beroperasi ditutup sebelum operasi selesai.
ERROR_WINHTTP_TIMEOUT
Waktu permintaan habis.
ERROR_NOT_ENOUGH_MEMORY
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.

Peringatan Saat menggunakan WinHTTP secara asinkron, selalu atur parameter lpdwNumberOfBytesWritten ke NULL dan ambil byte yang ditulis dalam fungsi panggilan balik; jika tidak, kesalahan memori dapat terjadi.
 
Saat aplikasi mengirim data, aplikasi dapat memanggil WinHttpReceiveResponse untuk mengakhiri transfer data. Jika WinHttpCloseHandle dipanggil, maka transfer data dibatalkan.

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
Dua masalah dapat muncul saat mencoba memPOSTING (atau MENEMPATKAN) data ke proksi atau server yang menantang menggunakan NTLM atau Menegosiasikan autentikasi. Pertama, proksi atau server ini dapat mengirim tantangan 401/407 dan menutup koneksi sebelum semua data dapat diPOSTING, dalam hal ini tidak hanya WinHttpWriteData gagal, tetapi juga WinHTTP tidak dapat menangani tantangan autentikasi. NTLM dan Negosiasi mengharuskan semua jabat tangan autentikasi ditukar pada koneksi soket yang sama, sehingga autentikasi gagal jika koneksi rusak sebelum waktunya.

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.

Catatan Untuk Windows XP dan Windows 2000, lihat bagian Persyaratan Run-Time di halaman mulai WinHTTP.
 

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.

Lihat juga

Tentang Microsoft Windows HTTP Services (WinHTTP)

Versi WinHTTP

WinHttpConnect

WinHttpBuka

WinHttpOpenRequest