Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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:
- 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.
- 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.
- Allokera en buffert med det antal byte som krävs.
- 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:
- Allokera en buffert som är tillräckligt stor för att innehålla strängnamnet för HTTP-huvudet.
- Skriv strängnamnet för HTTP-huvudet till bufferten.
- 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.
- Om anropet till HttpQueryInfo misslyckas och GetLastError returnerar ERROR_INSUFFICIENT_BUFFER, omallokera en buffert med det antal byte som krävs.
- Skriv strängnamnet för HTTP-huvudet till bufferten igen.
- 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).