Aracılığıyla paylaş


HTTP Üst Bilgilerini Alma

Bu öğreticide, HTTP isteklerinden üst bilgi bilgilerinin nasıl alındığı açıklanır.

Uygulama Adımları

Üst bilgi bilgilerini almanın iki yolu vardır:

  • Uygulamanızın ihtiyaç duyduğu HTTP üst bilgisi ile ilişkili Sorgu Bilgileri Bayrağı sabitlerinden birini kullanın.
  • HTTP_QUERY_CUSTOM öznitelik bayrağını kullanın ve HTTP üst bilgisinin adını geçirin.

Uygulamanızın ihtiyaç duyduğu HTTP üst bilgisiyle ilişkili olan sabiti kullanmak dahili olarak daha hızlıdır, ancak ilişkili sabiti bulunmayan HTTP üst bilgileri de olabilir. Bu gibi durumlarda, HTTP_QUERY_CUSTOM özniteliği bayrağını kullanan yöntem kullanılabilir.

Her iki yöntem de httpqueryinfoişlevini kullanır. HttpQueryInfo HTTP isteğinin yapıldığı HINTERNET tanıtıcısını, bir özniteliği, arabelleği, arabellek boyutunu içeren bir DWORD değerini ve dizin değerini alır. Verilerin döndürülmesi gereken biçimi belirtmek için httpqueryinfogeçirilen özniteliğine bir değiştirici de eklenebilir.

Sabit Kullanarak Üst Bilgileri Alma

HttpQueryInfoişlevini kullanarak sabit kullanarak http üst bilgisini almak için şu adımları izleyin:

  1. HttpQueryInfo işlevini, Öznitelikler listesinden bir sabit, NULL arabelleği ve arabellek boyutunu sıfır olarak ayarlanmış değişkenle çağırın. Ayrıca, uygulamanızın verilere belirli bir biçimde ihtiyacı varsa, Değiştiriciler listesinden bir sabit ekleyebilirsiniz.
  2. İstenen HTTP üst bilgisi varsa, HttpQueryInfo çağrısı başarısız olmalıdır, GetLastError ERROR_INSUFFICIENT_BUFFER geri döndürmelidir ve lpdwBufferLength parametresi için geçirilen değişken, gereken bayt sayısına ayarlanmalıdır.
  3. Gereken bayt sayısı kadar bir arabellek ayırın.
  4. çağrısını HttpQueryInfoile yeniden deneyin.

Aşağıdaki örnekte, döndürülen tüm HTTP üst bilgilerini isteyen özel bir değer olan HTTP_QUERY_RAW_HEADERS_CRLF sabitini kullanarak httpqueryinfoçağrısı gösterilmektedir.

// 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;
}

HTTP_QUERY_CUSTOM Kullanarak Üst Bilgileri Alma

HTTP_QUERY_CUSTOM kullanarak bir HTTP üst bilgisini almak için HttpQueryInfoişlevinikullanmak üzere şu adımları izleyin:

  1. HTTP üst bilgisi adını tutacak kadar büyük bir arabellek ayırın.
  2. HTTP üst bilgisinin dize adını arabelleğe yazın.
  3. httpQueryInfo fonksiyonunu, HTTP_QUERY_CUSTOM ile birlikte, HTTP üst bilgisinin dize adını içeren arabellek ve arabellek boyutunu tutan değişkenle çağırın. Ayrıca, uygulamanızın verilere belirli bir biçimde ihtiyacı varsa, Değiştiriciler listesinden bir sabit ekleyebilirsiniz.
  4. HttpQueryInfoçağrısı başarısız olursa ve GetLastErrorERROR_INSUFFICIENT_BUFFER döndürürse, gerekli bayt sayısıyla bir arabelleği yeniden tahsis edin.
  5. HTTP üst bilgisinin dizgi adını arabelleğe tekrar yazın.
  6. httpqueryinfoçağrısını yeniden deneyin.

Aşağıdaki örnekte, İçerik Türü HTTP üst bilgisini istemek için HTTP_QUERY_CUSTOM sabitini kullanarak httpqueryinfoçağrısı gösterilmektedir.

// 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;
}

Not

WinINet, sunucu uygulamalarını desteklemez. Ayrıca bir hizmet aracılığıyla kullanılmamalıdır. Sunucu uygulamaları veya hizmetleri için Microsoft Windows HTTP Services (WinHTTP)kullanın.