Sesi HTTP
WinINet memungkinkan Anda mengakses sumber daya di World Wide Web (WWW). Sumber daya ini dapat diakses langsung dengan menggunakanInternetOpenUrl(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 dibuat oleh fungsi yang bergantung padanya.
Untuk informasi selengkapnya, lihat Penanganan HINTERNET.
- 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 olehHttpOpenRequestatau fungsi 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. |
Untuk memulai koneksi ke WWW, aplikasi harus memanggil fungsiInternetConnectpadaHINTERNETroot yang dikembalikan oleh InternetOpen. InternetConnect harus membuat sesi HTTP dengan mendeklarasikan jenis layanan INTERNET_SERVICE_HTTP. Untuk informasi selengkapnya tentang menggunakanInternetConnect, lihat Menggunakan InternetConnect.
FungsiHttpOpenRequest membuka permintaan HTTP dan mengembalikan handelHINTERNETyang dapat digunakan oleh fungsi HTTP lainnya. Tidak seperti fungsi terbuka lainnya (seperti FtpOpenFile dan InternetOpenUrl), HttpOpenRequest tidak mengirim permintaan ke Internet saat dipanggil. FungsiHttpSendRequest 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 NULL, fungsi menggunakan ""HTTP/1.1"".
Perujuk menentukan alamat dokumen tempat nama objek diperoleh. Jika parameter ini null, tidak ada perujuk yang ditentukan.
String nullyang dihentikan 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 hanya menerima dokumen jenis ""text/*"". Nilai ""text/*"" menunjukkan dokumen hanya teks—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);
Fungsi HttpAddRequestHeaders memungkinkan aplikasi menambahkan satu atau beberapa header permintaan ke permintaan awal. Fungsi ini memungkinkan aplikasi untuk menambahkan header 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.
HttpAddRequestHeaders memerlukan handel permintaan HTTP yang dibuat oleh HttpOpenRequest, string yang berisi header, panjang header, dan pengubah.
HttpSendRequest membuat koneksi ke Internet dan mengirim permintaan ke situs yang ditentukan. Fungsi ini memerlukan handelHINTERNETyang 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 menggunakanInternetReadFile, InternetQueryDataAvailable, dan fungsi InternetSetFilePointer pada hinternet menangani yang dibuat oleh HttpOpenRequest untuk mengunduh sumber daya server.
Untuk memposting data ke server, kata kerja HTTP dalam panggilan ke HttpOpenRequest harus 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 fungsiInternetWriteFileuntuk memposting data pada handelHINTERNETyang dikirim menggunakan HttpSendRequestEx.
HttpQueryInfo memungkinkan aplikasi untuk mengambil informasi tentang permintaan HTTP. Fungsi ini memerlukan handelHINTERNETyang 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.
Setelah membuka permintaan dengan httpOpenRequest dan mengirimkannya ke server dengan HttpSendRequest, aplikasi dapat menggunakanInternetReadFile, InternetQueryDataAvailable, dan internetSetFilePointer fungsi untuk mengunduh sumber daya dari server HTTP.
Contoh berikut mengunduh sumber daya. Fungsi menerima handel ke jendela saat ini, nomor identifikasi kotak edit, dan handelHINTERNETyang dibuat oleh httpOpenRequest dan dikirim oleh HttpSendRequest. Ini menggunakanInternetQueryDataAvailable 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, tidak boleh digunakan dari layanan. Untuk implementasi atau layanan server, gunakan Microsoft Windows HTTP Services (WinHTTP).