URL 是位於因特網之資源的位置和存取方法的精簡表示法。 每個 URL 都包含配置(HTTP、HTTPS、FTP 或 Gopher)和配置特定的字串。 此字串也可以包含目錄路徑、搜尋字串或資源名稱的組合。 Microsoft Windows HTTP 服務 (WinHTTP) 函式可讓您建立、合併、細分和正式化 URL。 如需詳細資訊,請參閱 RFC 1738、統一資源定位器 和 RFC 2396、統一資源標識符 (URI):一般語法。
什麼是標準 URL?
指定的 URL 語法和語意會留下變化和錯誤的餘地。 標準化是將實際 URL 正規化成正確、標準、「標準」格式的程式。
這牽涉到將某些字元編碼為「逸出序列」。英數位元 US-ASCII 字元不需要編碼(數位0-9、大寫字母 A-Z和小寫字母 a-z)。 大部分的其他字元都必須逸出,包括控制字元、空格字元、百分比符號、「不安全字元」(<、>、“、#、{、}、|、\、^、~、[、]、' ,以及代碼點高於 127 的所有字元。
使用 WinHTTP 函式來處理 URL
WinHTTP 提供兩個處理 URL 的函式。 WinHttpCrackUrl 將 URL 分成其元件元件,WinHttpCreateUrl 從元件建立 URL。
分隔 URL
WinHttpCrackUrl 函式會將 URL 分成其元件元件,並傳回傳遞至函式之 URL_COMPONENTS 結構所指示的元件。
組成 URL_COMPONENTS 結構的元件是配置編號、主機名、埠號碼、使用者名稱、密碼、URL 路徑,以及其他資訊,例如搜尋參數。 除了配置和埠號碼之外,每個元件都有一個字串成員,其中包含資訊,以及保存字串成員長度的成員。 配置和埠號碼只有儲存對應值的成員;配置和埠號碼都會在所有成功呼叫 winHttpCrackUrl 時傳回。
若要擷取 URL_COMPONENTS 結構中特定元件的值,儲存該元件字串長度的成員必須設定為非零值。 字串成員可以是緩衝區的指標,或 NULL。
如果指標成員包含緩衝區的指標,字串長度成員必須包含該緩衝區的大小。 WinHttpCrackUrl 函式會將元件資訊當做緩衝區中的字串傳回,並將字串長度儲存在字串長度成員中。
如果指標成員設定為 NULL,字串長度成員可以設定為任何非零值。 WinHttpCrackUrl 函式會儲存 URL 字串的第一個字元指標,其中包含元件資訊,並將字串長度設定為與元件相關的 URL 字串其餘部分的字元數。
所有指標成員都會設定為 NULL,並將非零長度成員指向 URL 字串中適當的起點。 儲存在長度成員中的長度必須用來判斷個別元件信息的結尾。
若要正確初始化 URL_COMPONENTS 結構,dwStructSize 成員必須設定為 URL_COMPONENTS 結構的大小。
建立 URL
WinHttpCreateUrl 函式會使用先前所述的 URL_COMPONENTS 結構中的資訊來建立 URL。
對於每個必要元件,指標成員應該包含保存資訊的緩衝區指標。 如果指標成員包含以零結尾字串的指標,則長度成員應設定為零;如果指標成員包含不是以零結尾的字串指標,則長度成員應該設定為字串長度。 不需要之任何元件的指標成員必須設定為 NULL。
範例程序代碼
下列範例程式代碼示範如何使用 WinHttpCrackUrl 和 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;
}