Dela via


Hämtar HTTP-huvuden

I den här handledningen beskrivs hur du hämtar rubrikinformation från HTTP-begäranden.

Implementeringssteg

Det finns två sätt att hämta rubrikinformationen:

  • Använd en av de Query Info-flaggor konstanter som är kopplade till den HTTP-header som ditt program behöver.
  • Använd HTTP_QUERY_CUSTOM-attributflaggan och skicka namnet på HTTP-huvudet.

Att använda den konstant som är kopplad till den HTTP-header som ditt program behöver är snabbare internt, men det kan finnas HTTP-headers som inte har någon konstant kopplad till sig. I dessa fall är metoden med attributflaggan HTTP_QUERY_CUSTOM tillgänglig.

Båda metoderna använder funktionen HttpQueryInfo. HttpQueryInfo tar HINTERNET- handtag som HTTP-begäran gjordes på, ett attribut, en buffert, ett DWORD-värde som innehåller buffertstorleken och ett indexvärde. En modifierare kan också läggas till i attributet som skickas till HttpQueryInfo för att ange i vilket format data ska returneras.

Hämtar rubriker med hjälp av en konstant

Följ dessa steg om du vill använda funktionen HttpQueryInfo för att hämta ett HTTP-huvud med hjälp av en konstant:

  1. Anropa HttpQueryInfo med en konstant från listan Attribut, en NULL- buffert och variabeln som innehåller buffertstorleken inställd på noll. Om ditt program behöver data i ett visst format kan du också lägga till en konstant från listan Modifierare.
  2. Om det begärda HTTP-huvudet finns bör anropet till HttpQueryInfo misslyckas, GetLastError returnerar ERROR_INSUFFICIENT_BUFFER och variabeln som skickas för parametern lpdwBufferLength anges till det antal byte som krävs.
  3. Allokera en buffert med det antal byte som krävs.
  4. Försök igen med anropet till HttpQueryInfo.

Följande exempel visar ett anrop till HttpQueryInfo med hjälp av konstanten HTTP_QUERY_RAW_HEADERS_CRLF, vilket är ett särskilt värde som begär alla returnerade HTTP-huvuden.

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

Hämtar rubriker med hjälp av HTTP_QUERY_CUSTOM

Följ dessa steg om du vill använda funktionen HttpQueryInfo för att hämta ett HTTP-huvud med hjälp av HTTP_QUERY_CUSTOM:

  1. Allokera en buffert som är tillräckligt stor för att innehålla strängnamnet för HTTP-huvudet.
  2. Skriv strängnamnet för HTTP-huvudet till bufferten.
  3. Anropa HttpQueryInfo med HTTP_QUERY_CUSTOM, bufferten som innehåller strängnamnet för HTTP-huvudet och variabeln som innehåller buffertstorleken. Om ditt program behöver data i ett visst format kan du också lägga till en konstant från listan Modifierare.
  4. Om anropet till HttpQueryInfo misslyckas och GetLastError returnerar ERROR_INSUFFICIENT_BUFFER, omallokera en buffert med det antal byte som krävs.
  5. Skriv strängnamnet för HTTP-huvudet till bufferten igen.
  6. Försök igen med anropet till HttpQueryInfo.

Följande exempel visar ett anrop till HttpQueryInfo med hjälp av HTTP_QUERY_CUSTOM-konstanten för att begära HTTP-huvudet Content-Type.

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

Obs

WinINet stöder inte serverimplementeringar. Dessutom bör det inte användas i en tjänstemiljö. För serverimplementeringar eller tjänster använder du Microsoft Windows HTTP Services (WinHTTP).