Sesi HTTP
WinINet memungkinkan Anda mengakses sumber daya di World Wide Web (WWW). Sumber daya ini dapat diakses langsung dengan menggunakan InternetOpenUrl (untuk informasi selengkapnya, lihat Mengakses URL Secara Langsung).
Sumber daya di WWW diakses dengan menggunakan http. Fungsi HTTP menangani protokol yang mendasar, sambil memungkinkan aplikasi Anda mengakses informasi di WWW. Seiring berkembangnya protokol HTTP, protokol yang mendasar diperbarui untuk mempertahankan perilaku fungsi.
Diagram berikut menunjukkan hubungan fungsi yang digunakan dengan protokol HTTP. Kotak berbayang mewakili fungsi yang mengembalikan handel HINTERNET , sementara kotak biasa mewakili fungsi yang menggunakan handel HINTERNET yang dibuat oleh fungsi yang bergantung padanya.
Untuk informasi selengkapnya, lihat Handel HINTERNET.
Menggunakan Fungsi WinINet untuk Mengakses WWW
- Memulai Koneksi ke WWW
- Membuka Permintaan
- Menambahkan Header Permintaan
- Mengirim Permintaan
- Memposting Data ke Server
- Mendapatkan Informasi Tentang Permintaan
- Mengunduh Sumber Daya dari WWW
Fungsi berikut digunakan selama sesi HTTP untuk mengakses WWW.
Fungsi | Deskripsi |
---|---|
HttpAddRequestHeaders | Menambahkan header permintaan HTTP ke handel permintaan HTTP. Fungsi ini memerlukan handel yang dibuat oleh HttpOpenRequest. |
HttpOpenRequest | Membuka handel permintaan HTTP. Fungsi ini memerlukan handel yang dibuat oleh InternetConnect. |
HttpQueryInfo | Mengkueri informasi tentang permintaan HTTP. Fungsi ini memerlukan handel yang dibuat oleh fungsi HttpOpenRequest atau InternetOpenUrl . |
HttpSendRequest | Mengirim permintaan HTTP yang ditentukan ke server HTTP. Fungsi ini memerlukan handel yang dibuat oleh HttpOpenRequest. |
InternetErrorDlg | Menampilkan kotak dialog yang telah ditentukan sebelumnya untuk kondisi kesalahan Internet umum. Fungsi ini memerlukan handel yang digunakan dalam panggilan ke HttpSendRequest. |
Memulai Koneksi ke WWW
Untuk memulai koneksi ke WWW, aplikasi harus memanggil fungsi InternetConnect pada HINTERNET root yang dikembalikan oleh InternetOpen. InternetConnect harus membuat sesi HTTP dengan mendeklarasikan jenis layanan INTERNET_SERVICE_HTTP. Untuk informasi selengkapnya tentang menggunakan InternetConnect, lihat Menggunakan InternetConnect.
Membuka Permintaan
Fungsi HttpOpenRequest membuka permintaan HTTP dan mengembalikan handel HINTERNET yang dapat digunakan oleh fungsi HTTP lainnya. Tidak seperti fungsi terbuka lainnya (seperti FtpOpenFile dan InternetOpenUrl), HttpOpenRequest tidak mengirim permintaan ke Internet ketika dipanggil. Fungsi HttpSendRequest mengirimkan permintaan dan membuat koneksi melalui jaringan.
HttpOpenRequest mengambil handel sesi HTTP yang dibuat oleh InternetConnect dan kata kerja HTTP, nama objek, string versi, perujuk, jenis penerimaan, bendera, dan nilai konteks.
Kata kerja HTTP adalah string yang akan digunakan dalam permintaan. Kata kerja HTTP umum yang digunakan dalam permintaan termasuk GET, PUT, dan POST. Jika nilai ini diatur ke NULL, HttpOpenRequest menggunakan nilai default GET.
Nama objek adalah string yang berisi nama objek target kata kerja HTTP yang ditentukan. Ini umumnya adalah nama file, modul yang dapat dieksekusi, atau penentu pencarian. Jika nama objek yang disediakan adalah string kosong, HttpOpenRequest mencari halaman default.
String versi harus berisi versi HTTP. Jika parameter ini adalah NULL, fungsi menggunakan ""HTTP/1.1"".
Perujuk menentukan alamat dokumen tempat nama objek diperoleh. Jika parameter ini NULL, tidak ada perujuk yang ditentukan.
String yang dihentikan null yang berisi jenis terima menunjukkan jenis konten yang diterima oleh aplikasi. Mengatur parameter ini ke NULL menunjukkan bahwa tidak ada jenis konten yang diterima oleh aplikasi. Jika string kosong disediakan, aplikasi menunjukkan bahwa hanya menerima dokumen jenis ""text/*"". Nilai ""text/*"" menunjukkan dokumen teks saja—bukan gambar atau file biner lainnya.
Nilai bendera mengontrol penembolokan, cookie, dan masalah keamanan. Untuk Microsoft Network (MSN), NTLM, dan jenis autentikasi lainnya, atur bendera INTERNET_FLAG_KEEP_CONNECTION .
Jika bendera INTERNET_FLAG_ASYNC diatur dalam panggilan ke InternetBuka, nilai konteks bukan nol harus diatur untuk operasi asinkron yang tepat.
Contoh berikut adalah contoh panggilan ke HttpOpenRequest.
hHttpRequest = HttpOpenRequest( hHttpSession, "GET", "", NULL, "", NULL, 0, 0);
Menambahkan Header Permintaan
Fungsi HttpAddRequestHeaders memungkinkan aplikasi untuk menambahkan satu atau beberapa header permintaan ke permintaan awal. Fungsi ini memungkinkan aplikasi untuk menambahkan header format bebas tambahan ke handel permintaan HTTP; ini dimaksudkan untuk digunakan oleh aplikasi canggih yang memerlukan kontrol yang tepat atas permintaan yang dikirim ke server HTTP.
HttpAddRequestHeaders memerlukan handel permintaan HTTP yang dibuat oleh HttpOpenRequest, string yang berisi header, panjang header, dan pengubah.
Mengirim Permintaan
HttpSendRequest membuat koneksi ke Internet dan mengirim permintaan ke situs yang ditentukan. Fungsi ini memerlukan handel HINTERNET yang dibuat oleh HttpOpenRequest. HttpSendRequest juga dapat mengirim header tambahan atau informasi opsional. Informasi opsional umumnya digunakan untuk operasi yang menulis informasi ke server, seperti PUT dan POST.
Setelah HttpSendRequest mengirim permintaan, aplikasi dapat menggunakan fungsi InternetReadFile, InternetQueryDataAvailable, dan InternetSetFilePointer pada handel HINTERNET yang dibuat oleh HttpOpenRequest untuk mengunduh sumber daya server.
Memposting Data ke Server
Untuk memposting data ke server, kata kerja HTTP dalam panggilan ke HttpOpenRequest harus BERUPA POST atau PUT. Alamat buffer yang berisi data POST kemudian harus diteruskan ke parameter lpOptional di HttpSendRequest. Parameter dwOptionalLength harus diatur ke ukuran data.
Anda juga dapat menggunakan fungsi InternetWriteFile untuk memposting data pada handel HINTERNET yang dikirim menggunakan HttpSendRequestEx.
Mendapatkan Informasi Tentang Permintaan
HttpQueryInfo memungkinkan aplikasi untuk mengambil informasi tentang permintaan HTTP. Fungsi ini memerlukan handel HINTERNET yang dibuat oleh HttpOpenRequest atau InternetOpenUrl, nilai tingkat informasi, dan panjang buffer. HttpQueryInfo juga menerima buffer yang menyimpan informasi dan indeks header berbasis nol yang menghitung beberapa header dengan nama yang sama.
Mengunduh Sumber Daya dari WWW
Setelah membuka permintaan dengan HttpOpenRequest dan mengirimkannya ke server dengan HttpSendRequest, aplikasi dapat menggunakan fungsi InternetReadFile, InternetQueryDataAvailable, dan InternetSetFilePointer untuk mengunduh sumber daya dari server HTTP.
Contoh berikut mengunduh sumber daya. Fungsi menerima handel ke jendela saat ini, nomor identifikasi kotak edit, dan handel HINTERNET yang dibuat oleh HttpOpenRequest dan dikirim oleh HttpSendRequest. Ini menggunakan InternetQueryDataAvailable untuk menentukan ukuran sumber daya dan kemudian mengunduhnya menggunakan InternetReadFile. Konten kemudian ditampilkan dalam kotak edit.
int WINAPI Dumper(HWND hX, int intCtrlID, HINTERNET hResource)
{
LPTSTR lpszData; // buffer for the data
DWORD dwSize; // size of the data available
DWORD dwDownloaded; // size of the downloaded data
DWORD dwSizeSum=0; // size of the data in the textbox
LPTSTR lpszHolding; // buffer to merge the textbox data and buffer
// Set the cursor to an hourglass.
SetCursor(LoadCursor(NULL,IDC_WAIT));
// This loop handles reading the data.
do
{
// The call to InternetQueryDataAvailable determines the
// amount of data available to download.
if (!InternetQueryDataAvailable(hResource,&dwSize,0,0))
{
printf("InternetQueryDataAvailable failed (%d)\n", GetLastError());
SetCursor(LoadCursor(NULL,IDC_ARROW));
return FALSE;
}
else
{
// Allocate a buffer of the size returned by
// InternetQueryDataAvailable.
lpszData = new TCHAR[dwSize+1];
// Read the data from the HINTERNET handle.
if(!InternetReadFile(hResource,
(LPVOID)lpszData,
dwSize,
&dwDownloaded))
{
printf("InternetReadFile failed (%d)\n", GetLastError());
delete[] lpszData;
break;
}
else
{
// Add a null terminator to the end of the data buffer
lpszData[dwDownloaded]='\0';
// Allocate the holding buffer.
lpszHolding = new TCHAR[dwSizeSum + dwDownloaded + 1];
// Check if there has been any data written
// to the textbox.
if (dwSizeSum != 0)
{
// Retrieve the data stored in the textbox if any
GetDlgItemText(hX,intCtrlID,
(LPTSTR)lpszHolding,
dwSizeSum);
// Add a null terminator at the end of the
// textbox data.
lpszHolding[dwSizeSum]='\0';
}
else
{
// Make the holding buffer an empty string.
lpszHolding[0]='\0';
}
size_t cchDest = dwSizeSum + dwDownloaded + dwDownloaded + 1;
LPTSTR* ppszDestEnd = 0;
size_t* pcchRemaining = 0;
// Add the new data to the holding buffer
HRESULT hr = StringCchCatEx(lpszHolding,
cchDest,
lpszData,
ppszDestEnd,
pcchRemaining,
STRSAFE_NO_TRUNCATION);
if(SUCCEEDED(hr))
{
// Write the holding buffer to the textbox.
SetDlgItemText(hX,intCtrlID,(LPTSTR)lpszHolding);
// Delete the two buffers.
delete[] lpszHolding;
delete[] lpszData;
// Add the size of the downloaded data to the
// textbox data size.
dwSizeSum = dwSizeSum + dwDownloaded + 1;
// Check the size of the remaining data.
// If it is zero, break.
if (dwDownloaded == 0)
break;
else
{
// TODO: Insert error handling code here.
}
}
}
}
}
while(TRUE);
// Close the HINTERNET handle.
InternetCloseHandle(hResource);
// Set the cursor back to an arrow.
SetCursor(LoadCursor(NULL,IDC_ARROW));
return TRUE;
}
Catatan
WinINet tidak mendukung implementasi server. Selain itu, itu tidak boleh digunakan dari layanan. Untuk implementasi atau layanan server, gunakan Microsoft Windows HTTP Services (WinHTTP).
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk