Uniform Resource Locators (URLs) in WinHTTP
Eine URL ist eine kompakte Darstellung des Speicherorts und der Zugriffsmethode für eine Ressource im Internet. Jede URL besteht aus einem Schema (HTTP, HTTPS, FTP oder Gopher) und einer schemaspezifischen Zeichenfolge. Diese Zeichenfolge kann auch eine Kombination aus einem Verzeichnispfad, einer Suchzeichenfolge oder einem Namen der Ressource enthalten. Die Funktionen von Microsoft Windows HTTP Services (WinHTTP) bieten die Möglichkeit, URLs zu erstellen, zu kombinieren, aufzuschlüsseln und zu kanonisieren. Weitere Informationen finden Sie unter RFC 1738, Uniform Resource Locators und RFC 2396, Uniform Resource Identifiers (URI): Generic Syntax.
Was ist eine kanonisierte URL?
Die angegebene Syntax und Semantik von URLs lässt Raum für Variationen und Fehler. Kanonisierung ist der Prozess der Normalisierung einer tatsächlichen URL in eine korrekte, standardmäßige , "kanonische" Form.
Dazu müssen einige Zeichen als "Escapesequenzen" codiert werden. Alphanumerische US-ASCII-Zeichen müssen nicht codiert werden (die Ziffern 0-9, die Großbuchstaben A-Z und die Kleinbuchstaben a-z). Die meisten anderen Zeichen müssen mit Escapezeichen versehen werden, einschließlich Steuerzeichen, Leerzeichen, Prozentzeichen, "unsichere Zeichen" ( <, , >,, #, {, }, |, \, ^, ~, [, ], und ' ), und alle Zeichen mit einem Codepunkt über 127.
Verwenden der WinHTTP-Funktionen zum Behandeln von URLs
WinHTTP bietet zwei Funktionen für die Behandlung von URLs. WinHttpCrackUrl trennt eine URL in ihre Komponententeile, und WinHttpCreateUrl erstellt eine URL aus Komponenten.
Trennen von URLs
Die WinHttpCrackUrl-Funktion unterteilt eine URL in ihre Komponententeile und gibt die Komponenten zurück, die durch die URL_COMPONENTS-Struktur angegeben sind, die an die Funktion übergeben wird.
Die Komponenten, aus denen die URL_COMPONENTS-Struktur besteht, sind die Schemanummer, der Hostname, die Portnummer, der Benutzername, das Kennwort, der URL-Pfad und zusätzliche Informationen wie Suchparameter. Jede Komponente, mit Ausnahme des Schemas und der Portnummern, verfügt über einen Zeichenfolgenmember, der die Informationen enthält, und ein Element, das die Länge des Zeichenfolgenmembers enthält. Das Schema und die Portnummern verfügen nur über ein Element, das den entsprechenden Wert speichert. Sowohl das Schema als auch die Portnummer werden bei allen erfolgreichen Aufrufen von WinHttpCrackUrl zurückgegeben.
Um den Wert einer bestimmten Komponente in der URL_COMPONENTS-Struktur abzurufen, muss der Member, der die Zeichenfolgenlänge dieser Komponente speichert, auf einen Wert ohne Wert festgelegt werden. Das Zeichenfolgenelement kann entweder ein Zeiger auf einen Puffer oder NULL sein.
Wenn das Zeigerelement einen Zeiger auf einen Puffer enthält, muss der Zeichenfolgenlängenmember die Größe dieses Puffers enthalten. Die WinHttpCrackUrl-Funktion gibt die Komponenteninformationen als Zeichenfolge im Puffer zurück und speichert die Zeichenfolgenlänge im Zeichenfolgenlängenelement.
Wenn der Zeigermember auf NULL festgelegt ist, kann der Zeichenfolgenlängenmember auf einen beliebigen Nichtzerowert festgelegt werden. Die WinHttpCrackUrl-Funktion speichert einen Zeiger auf das erste Zeichen der URL-Zeichenfolge, die die Komponenteninformationen enthält, und legt die Zeichenfolgenlänge auf die Anzahl der Zeichen im verbleibenden Teil der URL-Zeichenfolge fest, die sich auf die Komponente bezieht.
Alle Zeigermember, die auf NULL festgelegt sind, wobei ein Member ohne Zerolänge auf den entsprechenden Startpunkt in der URL-Zeichenfolge zeigt. Die im Längenelement gespeicherte Länge muss verwendet werden, um das Ende der Informationen der einzelnen Komponente zu bestimmen.
Um die URL_COMPONENTS-Struktur ordnungsgemäß zu initialisieren, muss der dwStructSize-Member auf die Größe der URL_COMPONENTS-Struktur festgelegt werden.
Erstellen von URLs
Die WinHttpCreateUrl-Funktion verwendet die Informationen in der zuvor beschriebenen URL_COMPONENTS-Struktur , um eine URL zu erstellen.
Für jede erforderliche Komponente sollte der Zeigermember einen Zeiger auf den Puffer enthalten, der die Informationen enthält. Das Längenelement sollte auf 0 festgelegt werden, wenn das Zeigermember einen Zeiger auf eine Zeichenfolge mit Nullen enthält. Das Längenelement sollte auf die Zeichenfolgenlänge festgelegt werden, wenn das Zeigermember einen Zeiger auf eine Zeichenfolge enthält, die nicht mit Null beendet ist. Der Zeigermember aller komponenten, die nicht erforderlich sind, muss auf NULL festgelegt werden.
Beispielcode
Der folgende Beispielcode zeigt, wie Sie winHttpCrackUrl und WinHttpCreateUrl verwenden, um eine vorhandene URL zu disassemblieren, eine ihrer Komponenten zu ändern und sie in einer neuen URL zusammenzufügen.
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;
}