Abrufen von HTTP-Headern

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

Implementierungsschritte

Es gibt zwei Möglichkeiten zum Abrufen der Kopfzeileninformationen:

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

Die Verwendung der mit dem HTTP-Header verknüpften Konstanten, die Ihre Anwendung benötigt, ist intern schneller, es gibt jedoch möglicherweise HTTP-Header, die keine Konstante zugeordnet sind. In diesen Fällen ist die Methode mit dem attributkennzeichnung HTTP_QUERY_CUSTOM verfügbar.

Beide Methoden verwenden die HttpQueryInfo-Funktion . HttpQueryInfo verwendet den HINTERNET-Handle , auf dem die HTTP-Anforderung vorgenommen wurde, ein Attribut, einen Puffer, einen DWORD-Wert, der die Puffergröße und einen Indexwert enthält. Ein Modifizierer kann auch dem Attribut hinzugefügt werden, das an HttpQueryInfo übergeben wird, um anzugeben, welches Format die Daten zurückgegeben werden sollen.

Abrufen von Kopfzeilen mithilfe einer Konstante

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

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

Im folgenden Beispiel wird ein Aufruf von HttpQueryInfo mithilfe der HTTP_QUERY_RAW_HEADERS_CRLF -Konstante veranschaulicht, die einen speziellen Wert darstellt, 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 Kopfzeilen 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. Weisen 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, den Puffer, der den Zeichenfolgennamen des HTTP-Headers enthält, und die Variable, die die Puffergröße enthält. Wenn Ihre Anwendung auch die Daten in einem bestimmten Format benötigt, können Sie eine Konstante aus der Liste der Modifizierer hinzufügen.
  4. Wenn der Aufruf von HttpQueryInfo fehlschlägt und GetLastError ERROR_INSUFFICIENT_BUFFER zurückgibt, ordnen Sie einen Puffer mit der erforderlichen Anzahl von 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 zum Anfordern des HTTP-Headers vom Inhaltstyp veranschaulicht.

// 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 verwendet werden. Für Serverimplementierungen oder -dienste verwenden Sie Microsoft Windows HTTP-Dienste (WinHTTP).