共用方式為


WinHTTP 中的統一資源定位器 (URL)

URL 是位於網際網路之資源的位置和存取方法的精簡標記法。 每個 URL 都包含 (HTTP、HTTPS、FTP 或 Gopher) 和配置特定字串的配置。 此字串也可以包含目錄路徑、搜尋字串或資源名稱的組合。 Microsoft Windows HTTP Services (WinHTTP) 函式可讓您建立、合併、細分及正式化 URL。 如需詳細資訊,請參閱 RFC 1738統一資源定位器和RFC 2396統一資源識別項 (URI) :一般語法

什麼是標準 URL?

指定的 URL 語法和語意會留下變化和錯誤的空間。 標準化是將實際 URL 正規化為正確、標準、「標準」格式的程式。

這牽涉到將某些字元編碼為「逸出序列」。英數位元 US-ASCII 字元不需要編碼 (數位 0-9、大寫字母 A-Z 和小寫字母 a-z) 。 大部分的其他字元都必須逸出,包括控制字元、空白字元、百分比符號、「unsafe characters」 ( < 、 > 、、「、#、{、}、|、\、^、~、[、]、' ) ,以及具有 127 以上代碼點的所有字元。

使用 WinHTTP 函式來處理 URL

WinHTTP 提供兩個函式來處理 URL。 WinHttpC,Url 會將 URL 分成其元件元件,而 WinHttpCreateUrl 會從元件建立 URL。

分隔 URL

WinHttpC,Url函式會將 URL 分成其元件元件,並傳回傳遞至函式之 URL_COMPONENTS結構所指示的元件。

構成 URL_COMPONENTS 結構的元件是配置編號、主機名稱、埠號碼、使用者名稱、密碼、URL 路徑,以及其他資訊,例如搜尋參數。 除了配置和埠號碼以外,每個元件都有保存資訊的字串成員,以及保存字串成員長度的成員。 配置和埠號碼只有儲存對應值的成員;配置和埠號碼都會在所有成功呼叫 WinHttpC一Url時傳回。

若要擷取 URL_COMPONENTS 結構中特定元件的值,儲存該元件之字串長度的成員必須設定為非零值。 字串成員可以是緩衝區或 Null的指標。

如果指標成員包含緩衝區的指標,字串長度成員必須包含該緩衝區的大小。 WinHttpC,Url函式會以緩衝區中的字串的形式傳回元件資訊,並將字串長度儲存在字串長度成員中。

如果指標成員設定為 Null,字串長度成員可以設定為任何非零值。 WinHttpC,Url函式會儲存 URL 字串的第一個字元指標,其中包含元件資訊,並將字串長度設定為與元件相關之 URL 字串其餘部分中的字元數。

所有指標成員都設定為 Null ,且非零長度成員指向 URL 字串中適當的起點。 儲存在 length 成員中的長度必須用來判斷個別元件資訊的結尾。

若要正確初始化 URL_COMPONENTS 結構, dwStructSize 成員必須設定為 URL_COMPONENTS 結構的大小。

建立 URL

WinHttpCreateUrl函式會使用先前描述URL_COMPONENTS結構中的資訊來建立 URL。

對於每個必要元件,指標成員應該包含保存資訊的緩衝區指標。 如果指標成員包含以零結尾字串的指標,則長度成員應該設定為零;如果指標成員包含不是以零結尾的字串指標,則長度成員應該設定為字串長度。 任何不需要之元件的指標成員都必須設定為 Null

範例程式碼

下列範例程式碼示範如何使用WinHttpC,WinHttpCreateUrl來反組譯現有的 URL、修改其中一個元件,然後將它重新組譯成新的 URL。

  URL_COMPONENTS urlComp;
  LPCWSTR pwszUrl1 = 
    L"https://search.msn.com/results.asp?RS=CHECKED&FORM=MSNH&v=1&q=wininet";
  DWORD dwUrlLen = 0;

  // Initialize the URL_COMPONENTS structure.
  ZeroMemory(&urlComp, sizeof(urlComp));
  urlComp.dwStructSize = sizeof(urlComp);

  // Set required component lengths to non-zero so that they are cracked.
  urlComp.dwSchemeLength    = (DWORD)-1;
  urlComp.dwHostNameLength  = (DWORD)-1;
  urlComp.dwUrlPathLength   = (DWORD)-1;
  urlComp.dwExtraInfoLength = (DWORD)-1;

  // Crack the URL.
  if( !WinHttpCrackUrl( pwszUrl1, (DWORD)wcslen(pwszUrl1), 0, &urlComp ) )
      printf( "Error %u in WinHttpCrackUrl.\n", GetLastError( ) );
  else
  {
    // Change the search information.  New info is the same length.
    urlComp.lpszExtraInfo = L"?RS=CHECKED&FORM=MSNH&v=1&q=winhttp";

    // Obtain the size of the new URL and allocate memory.
    WinHttpCreateUrl( &urlComp, 0, NULL, &dwUrlLen );
    LPWSTR pwszUrl2 = new WCHAR[dwUrlLen];

    // Create a new URL.
    if( !WinHttpCreateUrl( &urlComp, 0, pwszUrl2, &dwUrlLen ) )
      printf( "Error %u in WinHttpCreateUrl.\n", GetLastError( ) );
    else
    {
      // Show both URLs.
      printf( "Old URL:  %S\nNew URL:  %S\n", pwszUrl1, pwszUrl2 );
    }

    // Free allocated memory.
    delete [] pwszUrl2;
  }