Udostępnij przez


Pobieranie nagłówków HTTP

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:

  1. 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 .
  2. 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.
  3. Przydziel bufor z wymaganą liczbą bajtów.
  4. 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:

  1. Przydziel bufor, który jest wystarczająco duży, aby przechowywać nazwę ciągu nagłówka HTTP.
  2. Zapisz nazwę ciągu nagłówka HTTP w buforze.
  3. 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 .
  4. Jeśli wywołanie metody HttpQueryInfo zakończy się niepowodzeniem i GetLastError zwróci ERROR_INSUFFICIENT_BUFFER, przydziel bufor z potrzebną liczbą bajtów.
  5. Ponownie zapisz nazwę ciągu nagłówka HTTP w buforze.
  6. 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).