Gambaran Umum Sesi WinHTTP
Microsoft Windows HTTP Services (WinHTTP) mengekspos sekumpulan fungsi C/C++ yang memungkinkan aplikasi Anda mengakses sumber daya HTTP di Web. Topik ini memberikan gambaran umum tentang bagaimana fungsi-fungsi ini digunakan untuk berinteraksi dengan server HTTP.
- Menggunakan API WinHTTP untuk Mengakses Web
- Menginisialisasi WinHTTP
- Membuka Permintaan
- Menambahkan Header Permintaan
- Mengirim Permintaan
- Memposting Data ke Server
- Mendapatkan Informasi Tentang Permintaan
- Mengunduh Sumber Daya dari Web
Menggunakan API WinHTTP untuk Mengakses Web
Diagram berikut menunjukkan urutan fungsi WinHTTP biasanya dipanggil saat berinteraksi dengan server HTTP. Kotak berbayang mewakili fungsi yang menghasilkan handel HINTERNET , sementara kotak biasa mewakili fungsi yang menggunakan handel tersebut.
Menginisialisasi WinHTTP
Sebelum berinteraksi dengan server, WinHTTP harus diinisialisasi dengan memanggil WinHttpBuka. WinHttpBuka membuat konteks sesi untuk mempertahankan detail tentang sesi HTTP, dan mengembalikan handel sesi. Dengan menggunakan handel ini, fungsi WinHttpConnect kemudian dapat menentukan server HTTP target atau Secure Hypertext Transfer Protocol (HTTPS).
Catatan
Panggilan ke WinHttpConnect tidak menghasilkan koneksi aktual ke server HTTP hingga permintaan dibuat untuk sumber daya tertentu.
Membuka Permintaan
Fungsi WinHttpOpenRequest membuka permintaan HTTP untuk sumber daya tertentu dan mengembalikan handel HINTERNET yang dapat digunakan oleh fungsi HTTP lainnya. WinHttpOpenRequest tidak mengirim permintaan ke server saat dipanggil. Fungsi WinHttpSendRequest benar-benar membuat koneksi melalui jaringan dan mengirim permintaan.
Contoh berikut ini memperlihatkan contoh panggilan ke WinHttpOpenRequest yang menggunakan opsi default.
HINTERNET hRequest = WinHttpOpenRequest( hConnect, L"GET", NULL, NULL, NULL, NULL, 0);
Menambahkan Header Permintaan
Fungsi WinHttpAddRequestHeaders memungkinkan aplikasi untuk menambahkan header permintaan format bebas tambahan ke handel permintaan HTTP. Ini ditujukan untuk digunakan oleh aplikasi canggih yang memerlukan kontrol yang tepat atas permintaan yang dikirim ke server HTTP.
Fungsi WinHttpAddRequestHeaders memerlukan handel permintaan HTTP yang dibuat oleh WinHttpOpenRequest, string yang berisi header, panjang header, dan pengubah apa pun.
Pengubah berikut dapat digunakan dengan WinHttpAddRequestHeaders.
Pengubah | Deskripsi |
---|---|
WINHTTP_ADDREQ_FLAG_ADD | Menambahkan header jika tidak ada. Digunakan dengan WINHTTP_ADDREQ_FLAG_REPLACE. |
WINHTTP_ADDREQ_FLAG_ADD_IF_NEW | Menambahkan header hanya jika belum ada; jika tidak, kesalahan dikembalikan. |
WINHTTP_ADDREQ_FLAG_COALESCE | Menggabungkan header dengan nama yang sama. |
WINHTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA | Menggabungkan header dengan nama yang sama menggunakan koma. Misalnya, menambahkan "Terima: teks/*" diikuti dengan "Terima: audio/*" dengan bendera ini membentuk header tunggal "Terima: teks/*, audio/*", menyebabkan header pertama ditemukan digabungkan. Terserah aplikasi panggilan untuk memastikan skema kohesif sehubungan dengan header yang digabungkan/terpisah. |
WINHTTP_ADDREQ_FLAG_COALESCE_WITH_SEMICOLON | Menggabungkan header dengan nama yang sama menggunakan titik koma. |
WINHTTP_ADDREQ_FLAG_REPLACE | Mengganti atau menghapus header. Jika nilai header kosong dan header ditemukan, header akan dihapus. Jika nilai header tidak kosong, nilai header diganti. |
Mengirim Permintaan
Fungsi WinHttpSendRequest membuat koneksi ke server dan mengirim permintaan ke situs yang ditentukan. Fungsi ini memerlukan handel HINTERNET yang dibuat oleh WinHttpOpenRequest. WinHttpSendRequest juga dapat mengirim header tambahan atau informasi opsional. Informasi opsional umumnya digunakan untuk operasi yang menulis informasi ke server, seperti PUT dan POST.
Setelah fungsi WinHttpSendRequest mengirim permintaan, aplikasi bisa menggunakan fungsi WinHttpReadData dan WinHttpQueryDataAvailable pada handel HINTERNET untuk mengunduh sumber daya server.
Memposting Data ke Server
Untuk memposting data ke server, kata kerja HTTP dalam panggilan ke WinHttpOpenRequest harus BERUPA POST atau PUT. Saat WinHttpSendRequest dipanggil, parameter dwTotalLength harus diatur ke ukuran data dalam byte. Lalu gunakan WinHttpWriteData untuk memposting data ke server.
Atau, atur parameter lpOptionalWinHttpSendRequest ke alamat buffer yang berisi data untuk diposting ke server. Saat menggunakan teknik ini, Anda harus mengatur parameter dwOptionalLength dan dwTotalLength dari WinHttpSendRequest menjadi ukuran data yang diposting. Memanggil WinHttpSendRequest dengan cara ini menghilangkan kebutuhan untuk memanggil WinHttpWriteData.
Mendapatkan Informasi Tentang Permintaan
Fungsi WinHttpQueryHeaders memungkinkan aplikasi untuk mengambil informasi tentang permintaan HTTP. Fungsi ini memerlukan handel HINTERNET yang dibuat oleh WinHttpOpenRequest, nilai tingkat informasi, dan panjang buffer. WinHttpQueryHeaders juga menerima buffer yang menyimpan informasi dan indeks header berbasis nol yang menghitung beberapa header dengan nama yang sama.
Gunakan salah satu nilai tingkat informasi yang ditemukan di halaman Bendera Info Kueri dengan pengubah untuk mengontrol format tempat informasi disimpan dalam parameter lpvBufferwinHttpQueryHeaders.
Mengunduh Sumber Daya dari Web
Setelah membuka permintaan dengan fungsi WinHttpOpenRequest , mengirimkannya ke server dengan WinHttpSendRequest, dan menyiapkan handel permintaan untuk menerima respons dengan WinHttpReceiveResponse, aplikasi bisa menggunakan fungsi WinHttpReadData dan WinHttpQueryDataAvailable untuk mengunduh sumber daya dari server HTTP.
Contoh kode berikut menunjukkan cara mengunduh sumber daya dengan semantik transaksi yang aman. 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 diulang 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( ) );
// Allocate space for the buffer.
pszOutBuffer = new char[dwSize+1];
if( !pszOutBuffer )
{
printf( "Out of memory\n" );
dwSize=0;
}
else
{
// 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;
}
} while( dwSize > 0 );
}
// 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 );