Recupero di intestazioni HTTP

Questa esercitazione descrive come recuperare le informazioni sull'intestazione dalle richieste HTTP.

Passaggi di implementazione

Esistono due modi per recuperare le informazioni sull'intestazione:

  • Usare una delle costanti Flag informazioni query associate all'intestazione HTTP necessaria per l'applicazione.
  • Usare il flag di attributo HTTP_QUERY_CUSTOM e passare il nome dell'intestazione HTTP.

L'uso della costante associata all'intestazione HTTP necessaria per l'applicazione è più veloce, ma potrebbero essere presenti intestazioni HTTP che non hanno una costante associata. Per questi casi, il metodo che usa il flag di attributo HTTP_QUERY_CUSTOM è disponibile.

Entrambi i metodi usano la funzione HttpQueryInfo . HttpQueryInfo accetta l'handle KPINET in cui è stata effettuata la richiesta HTTP, un attributo, un buffer, un valore DWORD contenente le dimensioni del buffer e un valore di indice. È anche possibile aggiungere un modificatore all'attributo passato a HttpQueryInfo per indicare in quale formato devono essere restituiti i dati.

Recupero di intestazioni tramite una costante

Per usare la funzione HttpQueryInfo per recuperare un'intestazione HTTP usando una costante, seguire questa procedura:

  1. Chiamare HttpQueryInfo con una costante dall'elenco Attributi , un buffer NULL e la variabile che contiene le dimensioni del buffer impostate su zero. Inoltre, se l'applicazione richiede i dati in un formato specifico, è possibile aggiungere una costante dall'elenco Modificatori .
  2. Se l'intestazione HTTP richiesta esiste, la chiamata a HttpQueryInfo deve non riuscire, GetLastError deve restituire ERROR_INSUFFICIENT_BUFFER e la variabile passata per il parametro lpdwBufferLength deve essere impostata sul numero di byte necessari.
  3. Allocare un buffer con il numero di byte necessari.
  4. Riprovare la chiamata a HttpQueryInfo.

Nell'esempio seguente viene illustrata una chiamata a HttpQueryInfo usando la costante HTTP_QUERY_RAW_HEADERS_CRLF, ovvero un valore speciale che richiede tutte le intestazioni HTTP restituite.

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

Recupero di intestazioni tramite HTTP_QUERY_CUSTOM

Per usare la funzione HttpQueryInfo per recuperare un'intestazione HTTP usando HTTP_QUERY_CUSTOM, seguire questa procedura:

  1. Allocare un buffer abbastanza grande per contenere il nome stringa dell'intestazione HTTP.
  2. Scrivere il nome stringa dell'intestazione HTTP nel buffer.
  3. Chiamare HttpQueryInfo con HTTP_QUERY_CUSTOM, il buffer contenente il nome stringa dell'intestazione HTTP e la variabile che contiene le dimensioni del buffer. Inoltre, se l'applicazione richiede i dati in un formato specifico, è possibile aggiungere una costante dall'elenco Modificatori .
  4. Se la chiamata a HttpQueryInfo ha esito negativo e GetLastError restituisce ERROR_INSUFFICIENT_BUFFER, riallocare un buffer con il numero di byte necessari.
  5. Scrivere di nuovo il nome della stringa dell'intestazione HTTP nel buffer.
  6. Riprovare la chiamata a HttpQueryInfo.

Nell'esempio seguente viene illustrata una chiamata a HttpQueryInfo usando la costante HTTP_QUERY_CUSTOM per richiedere l'intestazione HTTP di tipo contenuto.

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

Nota

WinINet non supporta le implementazioni del server. Inoltre, non deve essere usato da un servizio. Per le implementazioni o i servizi server usano Microsoft Windows HTTP Services (WinHTTP).