Abrufen von HTTP-Headern

In diesem Tutorial wird beschrieben, wie Headerinformationen aus HTTP-Anforderungen abgerufen werden.

Implementierungsschritte

Es gibt zwei Möglichkeiten, die Headerinformationen abzurufen:

  • Verwenden Sie eine der Konstanten des Abfrageinformationsflags , die dem HTTP-Header zugeordnet sind, den Ihre Anwendung benötigt.
  • Verwenden Sie das Attributflag HTTP_QUERY_CUSTOM, und übergeben Sie den Namen des HTTP-Headers.

Die Verwendung der Konstante, die dem HTTP-Header zugeordnet ist, den Ihre Anwendung benötigt, ist intern schneller, aber es gibt möglicherweise HTTP-Header, denen keine Konstante zugeordnet ist. In diesen Fällen ist die Methode verfügbar, die das Attributflag HTTP_QUERY_CUSTOM verwendet.

Beide Methoden verwenden die HttpQueryInfo-Funktion . HttpQueryInfo übernimmt das HINTERNET-Handle , für das die HTTP-Anforderung ausgeführt wurde, ein Attribut, einen Puffer, einen DWORD-Wert, der die Puffergröße enthält, und einen Indexwert. Ein Modifizierer kann auch dem an HttpQueryInfo übergebenen Attribut hinzugefügt werden, um anzugeben, in welchem Format die Daten zurückgegeben werden sollen.

Abrufen von Headern mithilfe einer Konstante

Führen Sie die folgenden Schritte aus, um die HttpQueryInfo-Funktion zum Abrufen eines HTTP-Headers mithilfe einer Konstante zu verwenden:

  1. Rufen Sie HttpQueryInfo mit einer Konstante aus der Liste Attribute, einem NULL-Puffer und der Variablen auf, die die Puffergröße enthält, die auf 0 festgelegt ist. Wenn Ihre Anwendung die Daten in einem bestimmten Format benötigt, können Sie auch eine Konstante aus der Liste Der Modifizierer hinzufügen.
  2. Wenn der angeforderte HTTP-Header vorhanden ist, sollte der Aufruf von HttpQueryInfo fehlschlagen. GetLastError sollte ERROR_INSUFFICIENT_BUFFER zurückgeben, und die für den parameter lpdwBufferLength übergebene Variable sollte auf die Anzahl der erforderlichen Bytes festgelegt werden.
  3. Ordnen Sie einen Puffer mit der anzahl der erforderlichen Bytes zu.
  4. Wiederholen Sie den Aufruf von HttpQueryInfo.

Im folgenden Beispiel wird ein Aufruf von HttpQueryInfo mithilfe der HTTP_QUERY_RAW_HEADERS_CRLF-Konstanten veranschaulicht. Hierbei handelt es sich um einen speziellen Wert, der alle zurückgegebenen HTTP-Header anfordert.

// 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;
}

Abrufen von Headern mithilfe von HTTP_QUERY_CUSTOM

Führen Sie die folgenden Schritte aus, um die HttpQueryInfo-Funktion zum Abrufen eines HTTP-Headers mithilfe von HTTP_QUERY_CUSTOM zu verwenden:

  1. Ordnen Sie einen Puffer zu, der groß genug ist, um den Zeichenfolgennamen des HTTP-Headers zu enthalten.
  2. Schreiben Sie den Zeichenfolgennamen des HTTP-Headers in den Puffer.
  3. Rufen Sie HttpQueryInfo mit HTTP_QUERY_CUSTOM auf, dem Puffer, der den Zeichenfolgennamen des HTTP-Headers enthält, und der Variablen, die die Puffergröße enthält. Wenn Ihre Anwendung die Daten in einem bestimmten Format benötigt, können Sie auch eine Konstante aus der Liste Der Modifizierer hinzufügen.
  4. Wenn der Aufruf von HttpQueryInfo fehlschlägt und GetLastError ERROR_INSUFFICIENT_BUFFER zurückgibt, stellen Sie einen Puffer mit der anzahl der erforderlichen Bytes um.
  5. Schreiben Sie den Zeichenfolgennamen des HTTP-Headers erneut in den Puffer.
  6. Wiederholen Sie den Aufruf von HttpQueryInfo.

Im folgenden Beispiel wird ein Aufruf von HttpQueryInfo mithilfe der HTTP_QUERY_CUSTOM Konstante veranschaulicht, um den Content-Type-HTTP-Header anzufordern.

// 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;
}

Hinweis

WinINet unterstützt keine Serverimplementierungen. Darüber hinaus sollte es nicht von einem Dienst aus verwendet werden. Verwenden Sie für Serverimplementierungen oder Dienste Microsoft Windows HTTP Services (WinHTTP).