HTTP ヘッダーの取得
このチュートリアルでは、HTTP 要求からヘッダー情報を取得する方法について説明します。
実装手順
ヘッダー情報を取得するには、次の 2 つの方法があります。
- アプリケーションで必要な HTTP ヘッダーに関連付けられている クエリ情報フラグ 定数のいずれかを使用します。
- HTTP_QUERY_CUSTOM属性フラグを使用し、HTTP ヘッダーの名前を渡します。
アプリケーションで必要な HTTP ヘッダーに関連付けられている定数の使用は、内部的には高速ですが、定数が関連付けられていない HTTP ヘッダーが存在する可能性があります。 このような場合は、HTTP_QUERY_CUSTOM属性フラグを使用するメソッドを使用できます。
どちらのメソッドも HttpQueryInfo 関数を使用します。 HttpQueryInfo は、HTTP 要求が行われた HINTERNET ハンドル、1 つの属性、バッファー、バッファー サイズを含む DWORD 値、およびインデックス値を受け取ります。 HttpQueryInfo に渡される属性に修飾子を追加して、データを返す形式を示すこともできます。
定数を使用したヘッダーの取得
HttpQueryInfo 関数を使用して定数を使用して HTTP ヘッダーを取得するには、次の手順に従います。
- 属性リストの定数、NULL バッファー、およびバッファー サイズを 0 に設定した変数を使用して、HttpQueryInfo を呼び出します。 また、アプリケーションで特定の形式のデータが必要な場合は、[ 修飾子] リストから定数を追加できます。
- 要求された HTTP ヘッダーが存在する場合、 HttpQueryInfo の呼び出しは失敗し、 GetLastError はERROR_INSUFFICIENT_BUFFERを返し、 lpdwBufferLength パラメーターに渡される変数は必要なバイト数に設定する必要があります。
- 必要なバイト数でバッファーを割り当てます。
- HttpQueryInfo の呼び出しを再試行します。
次の例では、HTTP_QUERY_RAW_HEADERS_CRLF定数を使用した HttpQueryInfo の呼び出しを示します。これは、返されるすべての HTTP ヘッダーを要求する特別な値です。
// 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;
}
HTTP_QUERY_CUSTOMを使用したヘッダーの取得
httpQueryInfo 関数を使用して、HTTP_QUERY_CUSTOMを使用して HTTP ヘッダーを取得するには、次の手順に従います。
- HTTP ヘッダーの文字列名を保持するのに十分な大きさのバッファーを割り当てます。
- HTTP ヘッダーの文字列名をバッファーに書き込みます。
- HTTP_QUERY_CUSTOM、HTTP ヘッダーの文字列名を含むバッファー、およびバッファー サイズを保持する変数を使用して HttpQueryInfo を呼び出します。 また、アプリケーションで特定の形式のデータが必要な場合は、[ 修飾子] リストから定数を追加できます。
- HttpQueryInfo の呼び出しが失敗し、GetLastError がERROR_INSUFFICIENT_BUFFERを返す場合は、必要なバイト数でバッファーを再割り当てします。
- HTTP ヘッダーの文字列名をもう一度バッファーに書き込みます。
- HttpQueryInfo の呼び出しを再試行します。
次の例では、HTTP_QUERY_CUSTOM定数を使用して Content-Type HTTP ヘッダーを要求する HttpQueryInfo の呼び出しを示します。
// 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;
}
Note
WinINet では、サーバーの実装はサポートされていません。 また、サービスから使用しないでください。 サーバーの実装またはサービスの場合は、 Microsoft Windows HTTP サービス (WinHTTP) を使用します。