Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym samouczku opisano sposób pobierania informacji nagłówka z żądań HTTP.
Kroki implementacji
Istnieją dwa sposoby pobierania informacji nagłówka:
- Użyj jednej ze stałych "Query Info Flag" powiązanych z nagłówkiem HTTP potrzebnym dla twojej aplikacji.
- Użyj flagi atrybutu HTTP_QUERY_CUSTOM i przekaż nazwę nagłówka HTTP.
Użycie stałej powiązanej z nagłówkiem HTTP, której potrzebuje aplikacja, działa szybciej wewnętrznie, ale mogą istnieć nagłówki HTTP, które nie mają z nią powiązanej stałej. W takich przypadkach dostępna jest metoda używająca flagi atrybutu HTTP_QUERY_CUSTOM.
Obie metody używają funkcji HttpQueryInfo. HttpQueryInfo przyjmuje HINTERNET uchwyt, na którym zostało wykonane żądanie HTTP, jeden atrybut, bufor, wartość DWORD zawierający rozmiar buforu i wartość indeksu. Modyfikator można również dodać do atrybutu przekazanego do HttpQueryInfo, aby wskazać, w jakim formacie dane powinny zostać zwrócone.
Pobieranie nagłówków za pomocą stałej
Aby użyć funkcji HttpQueryInfo w celu pobrania nagłówka HTTP przy użyciu stałej, wykonaj następujące kroki:
- Wywołaj HttpQueryInfo z stałą z listy atrybutów , buforem NULL oraz zmienną, która przechowuje rozmiar buforu ustawiony na zero. Ponadto, jeśli aplikacja potrzebuje danych w określonym formacie, możesz dodać stałą z listy modyfikatorów .
- Jeśli żądany nagłówek HTTP istnieje, wywołanie HttpQueryInfo powinno zakończyć się niepowodzeniem, GetLastError powinna zwrócić ERROR_INSUFFICIENT_BUFFER, a zmienna przekazana dla parametru lpdwBufferLeng th powinna być ustawiona na wymaganą liczbę bajtów.
- Przydziel bufor z wymaganą liczbą bajtów.
- Ponów próbę wywołania metody HttpQueryInfo.
W poniższym przykładzie pokazano wywołanie HttpQueryInfo przy użyciu stałej HTTP_QUERY_RAW_HEADERS_CRLF, która jest specjalną wartością żądającą wszystkich zwróconych nagłówków HTTP.
// 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;
}
Pobieranie nagłówków przy użyciu HTTP_QUERY_CUSTOM
Aby użyć funkcji HttpQueryInfo w celu pobrania nagłówka HTTP przy użyciu HTTP_QUERY_CUSTOM, wykonaj następujące kroki:
- Przydziel bufor, który jest wystarczająco duży, aby przechowywać nazwę ciągu nagłówka HTTP.
- Zapisz nazwę ciągu nagłówka HTTP w buforze.
- Wywołaj HttpQueryInfo za pomocą HTTP_QUERY_CUSTOM, buforu, który zawiera nazwę ciągu nagłówka HTTP, i zmiennej, która przechowuje rozmiar buforu. Ponadto, jeśli aplikacja potrzebuje danych w określonym formacie, możesz dodać stałą z listy modyfikatorów .
- Jeśli wywołanie metody HttpQueryInfo zakończy się niepowodzeniem i GetLastError zwróci ERROR_INSUFFICIENT_BUFFER, przydziel bufor z potrzebną liczbą bajtów.
- Ponownie zapisz nazwę ciągu nagłówka HTTP w buforze.
- Ponów próbę wywołania metody HttpQueryInfo.
W poniższym przykładzie pokazano wywołanie HttpQueryInfo przy użyciu stałej HTTP_QUERY_CUSTOM w celu żądania nagłówka HTTP typu zawartości.
// 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;
}
Notatka
Usługa WinINet nie obsługuje implementacji serwera. Ponadto nie należy jej używać w ramach usługi. W przypadku implementacji serwera lub usług należy użyć usług HTTP systemu Microsoft Windows (WinHTTP).