Uniform Resource Locators (URL) in WinHTTP
Adresa URL je kompaktní reprezentace umístění a metody přístupu pro prostředek umístěný na internetu. Každá adresa URL se skládá ze schématu (HTTP, HTTPS, FTP nebo Gopher) a řetězce specifického pro schéma. Tento řetězec může obsahovat také kombinaci cesty k adresáři, vyhledávacího řetězce nebo názvu prostředku. Funkce služby WinHTTP (Microsoft Windows HTTP Services) poskytují možnost vytvářet, kombinovat, rozdělit a kanonické adresy URL. Další informace naleznete v tématu RFC 1738, Uniform Resource Locators a RFC 2396, Uniform Resource Identifiers (URI): Obecná syntaxe.
Co je kanonický adresa URL?
Zadaná syntaxe a sémantika adres URL ponechá místo pro variantu a chybu. Kanonizace je proces normalizace skutečné adresy URL do správného standardního formátu "kanonického".
To zahrnuje kódování některých znaků jako "řídicí sekvence". Alfanumerické US-ASCII znaky nemusí být kódovány (číslice 0–9, velká písmena A-Z a malá písmena a-z). Většina dalších znaků musí být uchycená, včetně řídicích znaků, znaku mezery, znaku procenta, "nebezpečných znaků" ( <, >, ", #, {, }, |, \, ^, ~, [, ], a ' ) a všech znaků s bodem kódu nad 127.
Použití funkcí WinHTTP ke zpracování adres URL
WinHTTP poskytuje dvě funkce pro zpracování adres URL. WinHttpCrackUrl odděluje adresu URL do jejích součástí a WinHttpCreateUrl vytvoří adresu URL z komponent.
Oddělení adres URL
Funkce WinHttpCrackUrl rozdělí adresu URL do jejích součástí a vrátí komponenty označené strukturou URL_COMPONENTS, která je předána funkci.
Komponenty, které tvoří strukturu URL_COMPONENTS, jsou číslo schématu, název hostitele, číslo portu, uživatelské jméno, heslo, cesta adresy URL a další informace, jako jsou parametry hledání. Každá komponenta s výjimkou schématu a čísel portů má člen řetězce, který obsahuje informace a člen, který obsahuje délku členu řetězce. Schéma a čísla portů mají pouze člena, který ukládá odpovídající hodnotu; při všech úspěšných voláních WinHttpCrackUrlse vrátí schéma i čísla portů .
Chcete-li načíst hodnotu konkrétní komponenty ve struktuře URL_COMPONENTS, člen, který ukládá délku řetězce této komponenty, musí být nastaven na nenulovou hodnotu. Člen řetězce může být ukazatel na vyrovnávací paměť nebo NULL.
Pokud člen ukazatele obsahuje ukazatel na vyrovnávací paměť, člen délky řetězce musí obsahovat velikost této vyrovnávací paměti. Funkce WinHttpCrackUrl vrátí informace o komponentě jako řetězec ve vyrovnávací paměti a uloží délku řetězce v členu délky řetězce.
Pokud je člen ukazatele nastaven na NULL, může být člen délky řetězce nastaven na libovolnou nenulovou hodnotu. Funkce WinHttpCrackUrl uloží ukazatel na první znak řetězce adresy URL, který obsahuje informace o komponentě, a nastaví délku řetězce na počet znaků ve zbývající části řetězce adresy URL, který se týká komponenty.
Všechny členy ukazatele nastavené na NULL s nenulovou délkou členu na odpovídající výchozí bod v řetězci adresy URL. Délka uložená v členu délky musí být použita k určení konce informací o jednotlivých součástech.
Chcete-li dokončit správnou inicializaci struktury URL_COMPONENTS, musí být dwStructSize člen nastaven na velikost struktury URL_COMPONENTS.
Vytváření adres URL
Funkce WinHttpCreateUrl používá informace v dříve popsané struktuře URL_COMPONENTS k vytvoření adresy URL.
Pro každou požadovanou součást by člen ukazatele měl obsahovat ukazatel na vyrovnávací paměť, která obsahuje informace. Člen délky by měl být nastaven na nulu, pokud člen ukazatele obsahuje ukazatel na řetězec s nulovým ukončením; Člen délky by měl být nastaven na délku řetězce, pokud člen ukazatele obsahuje ukazatel na řetězec, který není ukončen nulou. Člen ukazatele všech komponent, které nejsou požadovány, musí být nastaven na NULL.
Ukázkový kód
Následující ukázkový kód ukazuje, jak pomocí WinHttpCrackUrl a WinHttpCreateUrl rozebrat existující adresu URL, upravit jednu z jejích komponent a znovu ji sestavit na novou adresu 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;
}