Delen via


HTTP-headers ophalen

In deze zelfstudie wordt beschreven hoe u headergegevens ophaalt uit HTTP-aanvragen.

Implementatiestappen

Er zijn twee manieren om de headergegevens op te halen:

  • Gebruik een van de querygegevensvlag constanten die zijn gekoppeld aan de HTTP-header die uw toepassing nodig heeft.
  • Gebruik de HTTP_QUERY_CUSTOM kenmerkvlag en geef de naam van de HTTP-header door.

Het gebruik van de constante die is gekoppeld aan de HTTP-header die uw toepassing nodig heeft, is intern sneller, maar er kunnen HTTP-headers zijn waaraan geen constante is gekoppeld. Voor deze gevallen is de methode met behulp van de HTTP_QUERY_CUSTOM kenmerkvlag beschikbaar.

Beide methoden gebruiken de functie HttpQueryInfo. HttpQueryInfo gebruikt de ACHTERNET- ingang waarop de HTTP-aanvraag is ingediend, één kenmerk, een buffer, een DWORD-waarde die de buffergrootte en een indexwaarde bevat. Een wijzigingsfunctie kan ook worden toegevoegd aan het kenmerk dat wordt doorgegeven aan HttpQueryInfo om aan te geven in welke indeling de gegevens moeten worden geretourneerd.

Headers ophalen met behulp van een constante

Als u de functie HttpQueryInfo wilt gebruiken om een HTTP-header op te halen met behulp van een constante, voert u de volgende stappen uit:

  1. Roep HttpQueryInfo- aan met een constante uit de lijst kenmerken, een NULL- buffer en de variabele met de buffergrootte ingesteld op nul. Als uw toepassing de gegevens in een bepaalde indeling nodig heeft, kunt u ook een constante toevoegen vanuit de Modifiers lijst.
  2. Als de aangevraagde HTTP-header bestaat, moet de aanroep naar HttpQueryInfo- mislukken. GetLastError- moet ERROR_INSUFFICIENT_BUFFER retourneren en de variabele die is doorgegeven voor de parameter lpdwBufferLength moet worden ingesteld op het aantal vereiste bytes.
  3. Wijs een buffer toe met het aantal vereiste bytes.
  4. Voer de aanroep opnieuw uit naar HttpQueryInfo-.

In het volgende voorbeeld ziet u een aanroep naar HttpQueryInfo- met behulp van de HTTP_QUERY_RAW_HEADERS_CRLF constante. Dit is een speciale waarde die alle geretourneerde HTTP-headers aanvraagt.

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

Headers ophalen met behulp van HTTP_QUERY_CUSTOM

Als u de functie HttpQueryInfo wilt gebruiken om een HTTP-header op te halen met behulp van HTTP_QUERY_CUSTOM, voert u de volgende stappen uit:

  1. Wijs een buffer toe die groot genoeg is om de tekenreeksnaam van de HTTP-header op te slaan.
  2. Schrijf de tekenreeksnaam van de HTTP-header naar de buffer.
  3. Roep HttpQueryInfo- aan met HTTP_QUERY_CUSTOM, de buffer die de tekenreeksnaam van de HTTP-header bevat en de variabele met de buffergrootte. Als uw toepassing de gegevens in een bepaalde indeling nodig heeft, kunt u ook een constante toevoegen vanuit de Modifiers lijst.
  4. Als de aanroep naar HttpQueryInfo- mislukt en GetLastError ERROR_INSUFFICIENT_BUFFER retourneert, moet u een buffer opnieuw toewijzen met het aantal vereiste bytes.
  5. Schrijf de tekenreeksnaam van de HTTP-header opnieuw naar de buffer.
  6. Voer de aanroep opnieuw uit naar HttpQueryInfo-.

In het volgende voorbeeld ziet u een aanroep naar HttpQueryInfo- met behulp van de HTTP_QUERY_CUSTOM constante om de HTTP-header van het inhoudstype aan te vragen.

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

Notitie

WinINet biedt geen ondersteuning voor serverimplementaties. Daarnaast mag deze niet worden gebruikt vanuit een service. Voor server-implementaties of -services wordt Microsoft Windows HTTP Services (WinHTTP)gebruikt.