HTTP ヘッダーの取得

このチュートリアルでは、HTTP 要求からヘッダー情報を取得する方法について説明します。

実装手順

ヘッダー情報を取得するには、次の 2 つの方法があります。

  • アプリケーションで必要な HTTP ヘッダーに関連 付けられているクエリ情報フラグ定数のいずれかを使用します。
  • HTTP _ QUERY _ CUSTOM 属性フラグを使用し、HTTP ヘッダーの名前を渡します。

アプリケーションで必要な HTTP ヘッダーに関連付けられている定数を使用すると、内部的に高速になりますが、定数が関連付けされていない HTTP ヘッダーが存在する可能性があります。 その場合は、HTTP QUERY CUSTOM 属性フラグ _ を使用する _ メソッドを使用できます。

どちらのメソッドも HttpQueryInfo 関数を使用 します。 HttpQueryInfo は、HTTP 要求が行われた HINTERNET ハンドル、1 つの属性、バッファー、バッファー サイズを含む DWORD 値、およびインデックス値を受け取ります。 HttpQueryInfoに渡される属性に修飾子を追加して、データを返す形式を指定できます。

定数を使用したヘッダーの取得

HttpQueryInfo 関数を使用して定数を使用して HTTP ヘッダーを取得するには、次の手順に従います。

  1. [属性] ボックスの一覧から 定数を指定して HttpQueryInfoを呼び出し 、NULL バッファーを、バッファー サイズを 0 に設定した変数を呼び出します。 また、アプリケーションで特定の形式のデータが必要な場合は、修飾子の一覧から定数 を追加 できます。
  2. 要求された HTTP ヘッダーが存在する場合 、HttpQueryInfo の呼び出しは失敗し 、GetLastError は ERROR INSUFFICIENT BUFFER を返し _ _ 、lpdwBufferLength パラメーターに渡される変数は必要なバイト数に設定する必要があります。
  3. 必要なバイト数のバッファーを割り当てる。
  4. 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 ヘッダーを取得 _ _ するには、次の手順に従います。

  1. HTTP ヘッダーの文字列名を保持するのに十分な大きなバッファーを割り当てる。
  2. HTTP ヘッダーの文字列名をバッファーに書き込みます。
  3. HTTP QUERY CUSTOM、HTTP ヘッダーの文字列名を含むバッファー、およびバッファー サイズを保持する変数を使用して 、HttpQueryInfo _ _ を呼び出します。 また、アプリケーションで特定の形式のデータが必要な場合は、修飾子の一覧から定数 を追加 できます。
  4. HttpQueryInfo の呼び出しが失敗し 、GetLastErrorが ERROR INSUFFICIENT BUFFER を返す場合は、必要なバイト数でバッファー _ _ を再割り当てします。
  5. HTTP ヘッダーの文字列名をバッファーに再度書き込みます。
  6. 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;
}

注意

WinINet では、サーバーの実装はサポートされていません。 また、サービスから使用する必要があります。 サーバーの実装またはサービスの場合は、Microsoft Windows HTTP サービス (WinHTTP) を使用します