Bagikan melalui


Fungsi WinHttpReadData (winhttp.h)

Fungsi WinHttpReadData membaca data dari handel yang dibuka oleh fungsi WinHttpOpenRequest .

Lihat juga WinHttpReadDataEx.

Sintaks

WINHTTPAPI BOOL WinHttpReadData(
  [in]  HINTERNET hRequest,
  [out] LPVOID    lpBuffer,
  [in]  DWORD     dwNumberOfBytesToRead,
  [out] LPDWORD   lpdwNumberOfBytesRead
);

Parameter

[in] hRequest

Handel HINTERNET yang valid dikembalikan dari panggilan sebelumnya ke WinHttpOpenRequest. WinHttpReceiveResponse atau WinHttpQueryDataAvailable harus dipanggil untuk handel ini dan harus selesai sebelum WinHttpReadData dipanggil. Meskipun memanggil WinHttpReadData segera setelah penyelesaian WinHttpReceiveResponse menghindari pengeluaran salinan buffer, melakukannya mengharuskan aplikasi menggunakan buffer panjang tetap untuk membaca.

[out] lpBuffer

Penunjuk ke buffer yang menerima data yang dibaca. Pastikan buffer ini tetap valid hingga WinHttpReadData selesai.

[in] dwNumberOfBytesToRead

Nilai bilangan bulat panjang yang tidak ditandatangani yang berisi jumlah byte yang akan dibaca.

[out] lpdwNumberOfBytesRead

Penunjuk ke variabel bilangan bulat panjang yang tidak ditandatangani yang menerima jumlah byte yang dibaca. WinHttpReadData mengatur nilai ini ke nol sebelum melakukan pemeriksaan kesalahan atau pekerjaan apa pun. Saat menggunakan WinHTTP secara asinkron, selalu atur parameter ini ke NULL dan ambil 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. Tabel berikut mengidentifikasi kode kesalahan yang dikembalikan.

Kode Kesalahan Deskripsi
ERROR_WINHTTP_CONNECTION_ERROR
Koneksi dengan server telah direset atau dihentikan, atau protokol SSL yang tidak kompatibel ditemukan. Misalnya, WinHTTP 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_RESPONSE_DRAIN_OVERFLOW
Dikembalikan saat respons masuk melebihi batas ukuran WinHTTP internal.
ERROR_WINHTTP_TIMEOUT
Waktu permintaan habis.
ERROR_NOT_ENOUGH_MEMORY
Tidak tersedia cukup memori untuk menyelesaikan operasi yang diminta. (Kode galat Windows)

Keterangan

Dimulai di Windows Vista dan Windows Server 2008, WinHttp memungkinkan aplikasi untuk melakukan pengodean transfer terpotong pada data yang dikirim ke server. Saat header Transfer-Encoding ada di respons WinHttp, WinHttpReadData menghapus informasi penggugusan sebelum memberikan data ke aplikasi.

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, fungsi ini gagal dan Anda dapat memanggil GetLastError untuk mendapatkan informasi kesalahan yang diperluas. Jika fungsi ini mengembalikan TRUE, gunakan penyelesaian WINHTTP_CALLBACK_STATUS_READ_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 Ketika WinHTTP digunakan dalam mode asinkron, selalu atur parameter lpdwNumberOfBytesRead ke NULL dan ambil byte yang dibaca dalam fungsi panggilan balik; jika tidak, kesalahan memori dapat terjadi.
 
Ketika buffer baca sangat kecil, WinHttpReadData mungkin selesai secara sinkron. Jika penyelesaian WINHTTP_CALLBACK_STATUS_READ_COMPLETE memicu panggilan lain ke WinHttpReadData, situasinya bisa mengakibatkan luapan tumpukan. Secara umum, yang terbaik adalah menggunakan buffer baca yang sebanding dalam ukuran, atau lebih besar dari buffer baca internal yang digunakan oleh WinHTTP, yaitu 8 KB.

Jika Anda menggunakan WinHttpReadData secara sinkron, dan nilai yang dikembalikan adalah TRUE dan jumlah byte yang dibaca adalah nol, transfer telah selesai dan tidak ada lagi byte untuk dibaca pada handel. Ini dianalogikan untuk mencapai akhir file dalam file lokal. Jika Anda menggunakan fungsi secara asinkron, panggilan balik WINHTTP_CALLBACK_STATUS_READ_COMPLETE dipanggil dengan parameter dwStatusInformationLength diatur ke nol saat akhir respons ditemukan.

WinHttpReadData mencoba mengisi buffer yang diacu oleh lpBuffer hingga tidak ada lagi data yang tersedia dari respons. Jika data yang memadai belum tiba dari server, buffer tidak terisi.

Untuk handel HINTERNET yang dibuat oleh fungsi WinHttpOpenRequest dan dikirim oleh WinHttpSendRequest, panggilan ke WinHttpReceiveResponse harus dilakukan pada handel sebelum WinHttpReadData dapat digunakan.

Karakter byte tunggal yang diambil dengan WinHttpReadData tidak dikonversi menjadi karakter multi-byte.

Ketika buffer baca sangat kecil, WinHttpReadData dapat selesai secara sinkron, dan jika penyelesaian WINHTTP_CALLBACK_STATUS_READ_COMPLETE maka memicu panggilan lain ke WinHttpReadData, luapan tumpukan dapat menghasilkan. Yang terbaik adalah menggunakan buffer baca yang berukuran 8 Kilobyte atau lebih besar.

Jika data yang memadai belum tiba dari server, WinHttpReadData tidak sepenuhnya mengisi buffer yang ditujukan oleh lpBuffer. Buffer harus cukup besar setidaknya untuk menahan header HTTP pada bacaan pertama, dan ketika membaca entri direktori yang dikodekan HTML, harus cukup besar untuk menahan setidaknya satu entri lengkap.

Jika fungsi panggilan balik status telah diinstal dengan menggunakan WinHttpSetStatusCallback, pemberitahuan berikut yang telah diatur dalam parameter dwNotificationFlags dari WinHttpSetStatusCallback menunjukkan kemajuan dalam memeriksa data yang tersedia:

  • WINHTTP_CALLBACK_STATUS_RECEIVING_RESPONSE
  • WINHTTP_CALLBACK_STATUS_RESPONSE_RECEIVED
  • WINHTTP_CALLBACK_STATUS_CONNECTION_CLOSED
  • WINHTTP_CALLBACK_STATUS_READ_COMPLETE
Catatan Untuk Windows XP dan Windows 2000, lihat bagian Persyaratan Run-Time di halaman mulai WinHttp.
 

Contoh

Contoh berikut menunjukkan cara menggunakan semantik transaksi aman untuk mengunduh sumber daya dari server Secure Hypertext Transfer Protocol (HTTPS). Kode sampel menginisialisasi antarmuka pemrograman aplikasi WinHTTP (API), memilih server HTTPS target, lalu membuka dan mengirim permintaan untuk sumber daya aman ini.
WinHttpQueryDataAvailable digunakan dengan handel permintaan untuk menentukan berapa banyak data yang tersedia untuk diunduh, lalu WinHttpReadData digunakan untuk membaca data tersebut. Proses ini berulang hingga seluruh dokumen diambil dan ditampilkan.

    DWORD dwSize = 0;
    DWORD dwDownloaded = 0;
    LPSTR pszOutBuffer;
    BOOL  bResults = FALSE;
    HINTERNET  hSession = NULL, 
               hConnect = NULL,
               hRequest = NULL;

    // Use WinHttpOpen to obtain a session handle.
    hSession = WinHttpOpen( L"WinHTTP Example/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.microsoft.com",
                                   INTERNET_DEFAULT_HTTPS_PORT, 0);

    // Create an HTTP request handle.
    if (hConnect)
        hRequest = WinHttpOpenRequest( hConnect, L"GET", NULL,
                                       NULL, WINHTTP_NO_REFERER, 
                                       WINHTTP_DEFAULT_ACCEPT_TYPES, 
                                       WINHTTP_FLAG_SECURE);

    // Send a request.
    if (hRequest)
        bResults = WinHttpSendRequest( hRequest,
                                       WINHTTP_NO_ADDITIONAL_HEADERS,
                                       0, WINHTTP_NO_REQUEST_DATA, 0, 
                                       0, 0);

 
    // End the request.
    if (bResults)
        bResults = WinHttpReceiveResponse( hRequest, NULL);

    // Keep checking for data until there is nothing left.
    if (bResults)
    {
        do 
        {
            // Check for available data.
            dwSize = 0;
            if (!WinHttpQueryDataAvailable( hRequest, &dwSize)) 
            {
                printf( "Error %u in WinHttpQueryDataAvailable.\n",
                        GetLastError());
                break;
            }
            
            // No more available data.
            if (!dwSize)
                break;

            // Allocate space for the buffer.
            pszOutBuffer = new char[dwSize+1];
            if (!pszOutBuffer)
            {
                printf("Out of memory\n");
                break;
            }
            
            // Read the Data.
            ZeroMemory(pszOutBuffer, dwSize+1);

            if (!WinHttpReadData( hRequest, (LPVOID)pszOutBuffer, 
                                  dwSize, &dwDownloaded))
            {                                  
                printf( "Error %u in WinHttpReadData.\n", GetLastError());
            }
            else
            {
                printf("%s", pszOutBuffer);
            }
        
            // Free the memory allocated to the buffer.
            delete [] pszOutBuffer;

            // This condition should never be reached since WinHttpQueryDataAvailable
            // reported that there are bits to read.
            if (!dwDownloaded)
                break;
                
        } while (dwSize > 0);
    }
    else
    {
        // Report any errors.
        printf( "Error %d has occurred.\n", GetLastError() );
    }

    // Close any open handles.
    if (hRequest) WinHttpCloseHandle(hRequest);
    if (hConnect) WinHttpCloseHandle(hConnect);
    if (hSession) WinHttpCloseHandle(hSession);

Persyaratan

Persyaratan Nilai
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

WinHttpCloseHandle

WinHttpConnect

WinHttpBuka

WinHttpOpenRequest

WinHttpQueryDataAvailable

WinHttpSendRequest

WinHttpWriteData