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).
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour