Récupération des en-têtes HTTP
Ce tutoriel explique comment récupérer des informations d’en-tête à partir de requêtes HTTP.
Étapes d’implémentation
Il existe deux façons de récupérer les informations d’en-tête :
- Utilisez l’une des constantes d’indicateur d’informations de requête associées à l’en-tête HTTP dont votre application a besoin.
- Utilisez l’indicateur d’attribut HTTP_QUERY_CUSTOM et transmettez le nom de l’en-tête HTTP.
L’utilisation de la constante associée à l’en-tête HTTP dont votre application a besoin est plus rapide en interne, mais il peut y avoir des en-têtes HTTP qui n’ont pas de constante associée. Dans ce cas, la méthode utilisant l’indicateur d’attribut HTTP_QUERY_CUSTOM est disponible.
Les deux méthodes utilisent la fonction HttpQueryInfo . HttpQueryInfo prend le handle HINTERNET sur lequel la requête HTTP a été effectuée, un attribut, une mémoire tampon, une valeur DWORD qui contient la taille de la mémoire tampon et une valeur d’index. Un modificateur peut également être ajouté à l’attribut passé à HttpQueryInfo pour indiquer dans quel format les données doivent être retournées.
Récupération d’en-têtes à l’aide d’une constante
Pour utiliser la fonction HttpQueryInfo pour récupérer un en-tête HTTP à l’aide d’une constante, procédez comme suit :
- Appelez HttpQueryInfo avec une constante de la liste Attributs , une mémoire tampon NULL et la variable qui contient la taille de la mémoire tampon définie sur zéro. En outre, si votre application a besoin des données dans un format particulier, vous pouvez ajouter une constante à partir de la liste Des modificateurs .
- Si l’en-tête HTTP demandé existe, l’appel à HttpQueryInfo doit échouer, GetLastError doit retourner ERROR_INSUFFICIENT_BUFFER et la variable passée pour le paramètre lpdwBufferLength doit être définie sur le nombre d’octets requis.
- Allouez une mémoire tampon avec le nombre d’octets requis.
- Réessayez l’appel à HttpQueryInfo.
L’exemple suivant illustre un appel à HttpQueryInfo à l’aide de la constante HTTP_QUERY_RAW_HEADERS_CRLF, qui est une valeur spéciale qui demande tous les en-têtes HTTP retournés.
// 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;
}
Récupération d’en-têtes à l’aide de HTTP_QUERY_CUSTOM
Pour utiliser la fonction HttpQueryInfo afin de récupérer un en-tête HTTP à l’aide de HTTP_QUERY_CUSTOM, procédez comme suit :
- Allouez une mémoire tampon suffisamment grande pour contenir le nom de chaîne de l’en-tête HTTP.
- Écrivez le nom de chaîne de l’en-tête HTTP dans la mémoire tampon.
- Appelez HttpQueryInfo avec HTTP_QUERY_CUSTOM, la mémoire tampon qui contient le nom de chaîne de l’en-tête HTTP et la variable qui contient la taille de la mémoire tampon. En outre, si votre application a besoin des données dans un format particulier, vous pouvez ajouter une constante à partir de la liste Des modificateurs .
- Si l’appel à HttpQueryInfo échoue et que GetLastError retourne ERROR_INSUFFICIENT_BUFFER, réallouez une mémoire tampon avec le nombre d’octets requis.
- Réécrivez le nom de chaîne de l’en-tête HTTP dans la mémoire tampon.
- Réessayez l’appel à HttpQueryInfo.
L’exemple suivant illustre un appel à HttpQueryInfo à l’aide de la constante HTTP_QUERY_CUSTOM pour demander l’en-tête HTTP 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;
}
Notes
WinINet ne prend pas en charge les implémentations de serveur. En outre, il ne doit pas être utilisé à partir d’un service. Pour les implémentations de serveur ou les services, utilisez Microsoft Windows HTTP Services (WinHTTP).