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:
- 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 .
- 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.
- Allocare un buffer con il numero di byte necessari.
- 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:
- Allocare un buffer abbastanza grande per contenere il nome stringa dell'intestazione HTTP.
- Scrivere il nome stringa dell'intestazione HTTP nel buffer.
- 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 .
- Se la chiamata a HttpQueryInfo ha esito negativo e GetLastError restituisce ERROR_INSUFFICIENT_BUFFER, riallocare un buffer con il numero di byte necessari.
- Scrivere di nuovo il nome della stringa dell'intestazione HTTP nel buffer.
- 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).