Mengambil Header HTTP
Tutorial ini menjelaskan cara mengambil informasi header dari permintaan HTTP.
Langkah-langkah Implementasi
Ada dua cara untuk mengambil informasi header:
- Gunakan salah satu konstanta Bendera Info Kueri yang terkait dengan header HTTP yang dibutuhkan aplikasi Anda.
- Gunakan bendera atribut HTTP_QUERY_CUSTOM dan berikan nama header HTTP.
Menggunakan konstanta yang terkait dengan header HTTP yang dibutuhkan aplikasi Anda lebih cepat secara internal, tetapi mungkin ada header HTTP yang tidak memiliki konstanta yang terkait dengannya. Untuk kasus tersebut, metode yang menggunakan bendera atribut HTTP_QUERY_CUSTOM tersedia.
Kedua metode menggunakan fungsi HttpQueryInfo . HttpQueryInfo mengambil handel HINTERNET tempat permintaan HTTP dibuat, satu atribut, buffer, nilai DWORD yang berisi ukuran buffer, dan nilai indeks. Pengubah juga dapat ditambahkan ke atribut yang diteruskan ke HttpQueryInfo untuk menunjukkan dalam format apa data harus dikembalikan.
Mengambil Header Menggunakan Konstanta
Untuk menggunakan fungsi HttpQueryInfo untuk mengambil header HTTP menggunakan konstanta, ikuti langkah-langkah berikut:
- Panggil HttpQueryInfo dengan konstanta dari daftar Atribut, buffer NULL , dan variabel yang menyimpan ukuran buffer yang diatur ke nol. Selain itu, jika aplikasi Anda membutuhkan data dalam format tertentu, Anda dapat menambahkan konstanta dari daftar Pengubah .
- Jika header HTTP yang diminta ada, panggilan ke HttpQueryInfo harus gagal, GetLastError harus mengembalikan ERROR_INSUFFICIENT_BUFFER, dan variabel yang diteruskan untuk parameter lpdwBufferLength harus diatur ke jumlah byte yang diperlukan.
- Alokasikan buffer dengan jumlah byte yang diperlukan.
- Coba lagi panggilan ke HttpQueryInfo.
Sampel berikut menunjukkan panggilan ke HttpQueryInfo menggunakan konstanta HTTP_QUERY_RAW_HEADERS_CRLF, yang merupakan nilai khusus yang meminta semua header HTTP yang dikembalikan.
// Retrieving Headers Using a Constant
BOOL SampleCodeOne(HINTERNET hHttp)
{
LPVOID lpOutBuffer=NULL;
DWORD dwSize = 0;
retry:
// This call will fail on the first pass, because
// no buffer is allocated.
if(!HttpQueryInfo(hHttp,HTTP_QUERY_RAW_HEADERS_CRLF,
(LPVOID)lpOutBuffer,&dwSize,NULL))
{
if (GetLastError()==ERROR_HTTP_HEADER_NOT_FOUND)
{
// Code to handle the case where the header isn't available.
return TRUE;
}
else
{
// Check for an insufficient buffer.
if (GetLastError()==ERROR_INSUFFICIENT_BUFFER)
{
// Allocate the necessary buffer.
lpOutBuffer = new char[dwSize];
// Retry the call.
goto retry;
}
else
{
// Error handling code.
if (lpOutBuffer)
{
delete [] lpOutBuffer;
}
return FALSE;
}
}
}
if (lpOutBuffer)
{
delete [] lpOutBuffer;
}
return TRUE;
}
Mengambil Header Menggunakan HTTP_QUERY_CUSTOM
Untuk menggunakan fungsi HttpQueryInfo untuk mengambil header HTTP menggunakan HTTP_QUERY_CUSTOM, ikuti langkah-langkah berikut:
- Alokasikan buffer yang cukup besar untuk menahan nama string header HTTP.
- Tulis nama string header HTTP ke dalam buffer.
- Panggil HttpQueryInfo dengan HTTP_QUERY_CUSTOM, buffer yang berisi nama string header HTTP, dan variabel yang menyimpan ukuran buffer. Selain itu, jika aplikasi Anda membutuhkan data dalam format tertentu, Anda dapat menambahkan konstanta dari daftar Pengubah .
- Jika panggilan ke HttpQueryInfo gagal dan GetLastError mengembalikan ERROR_INSUFFICIENT_BUFFER, realokasi buffer dengan jumlah byte yang diperlukan.
- Tulis nama string header HTTP ke dalam buffer lagi.
- Coba lagi panggilan ke HttpQueryInfo.
Contoh berikut menunjukkan panggilan ke HttpQueryInfo menggunakan konstanta HTTP_QUERY_CUSTOM untuk meminta header HTTP Jenis Konten.
// Retrieving Headers Using HTTP_QUERY_CUSTOM
BOOL SampleCodeTwo(HINTERNET hHttp)
{
DWORD dwSize = 20;
LPVOID lpOutBuffer = new char[dwSize];
StringCchPrintfA((LPSTR)lpOutBuffer,dwSize,"Content-Type");
retry:
if(!HttpQueryInfo(hHttp,HTTP_QUERY_CUSTOM,
(LPVOID)lpOutBuffer,&dwSize,NULL))
{
if (GetLastError()==ERROR_HTTP_HEADER_NOT_FOUND)
{
// Code to handle the case where the header isn't available.
delete [] lpOutBuffer;
return TRUE;
}
else
{
// Check for an insufficient buffer.
if (GetLastError()==ERROR_INSUFFICIENT_BUFFER)
{
// Allocate the necessary buffer.
delete [] lpOutBuffer;
lpOutBuffer = new char[dwSize];
// Rewrite the header name in the buffer.
StringCchPrintfA((LPSTR)lpOutBuffer,
dwSize,"Content-Type");
// Retry the call.
goto retry;
}
else
{
// Error handling code.
delete [] lpOutBuffer;
return FALSE;
}
}
}
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).