Behandeln von einheitlichen Ressourcenlocators
Ein Uniform Resource Locator (URL) ist eine kompakte Darstellung des Speicherorts und der Zugriffsmethode für eine Ressource im Internet. Jede URL besteht aus einem Schema (HTTP, HTTPS oder FTP) und einer schemaspezifischen Zeichenfolge. Diese Zeichenfolge kann auch eine Kombination aus einem Verzeichnispfad, einer Suchzeichenfolge oder einem Namen der Ressource enthalten. Die WinINet-Funktionen bieten die Möglichkeit, URLs zu erstellen, zu kombinieren, aufzubrechen und zu kanonisieren. Weitere Informationen zu URLs finden Sie unter RFC-1738 unter Uniform Resource Locators (URL).
Die URL-Funktionen werden aufgabenorientiert ausgeführt. Der Inhalt und das Format der URL, die der Funktion übergeben wird, werden nicht überprüft. Die aufrufende Anwendung sollte die Verwendung dieser Funktionen nachverfolgen, um sicherzustellen, dass die Daten das beabsichtigte Format aufweisen. Beispielsweise würde die InternetCanonicalizeUrl-Funktion das Zeichen "%" in die Escapesequenz "%25" konvertieren, wenn keine Flags verwendet werden. Wenn InternetCanonicalizeUrl für die kanonische URL verwendet wird, wird die Escapesequenz "%25" in die Escapesequenz "%2525" konvertiert, was nicht ordnungsgemäß funktioniert.
- Was ist eine kanonisierte URL?
- Verwenden der WinINet-Funktionen zum Verarbeiten von URLs
- Kanonisieren von URLs
- Kombinieren von Basis- und relativen URLs
- Entleeren von URLs
- Erstellen von URLs
- Direktes Zugreifen auf URLs
Was ist eine kanonisierte URL?
Das Format aller URLs muss der akzeptierten Syntax und Semantik entsprechen, um über das Internet auf Ressourcen zugreifen zu können. Kanonisierung ist der Prozess der Formatierung einer URL, um dieser akzeptierten Syntax und Semantik zu folgen.
Zeichen, die codiert werden müssen, enthalten alle Zeichen, die im US-ASCII-codierten Zeichensatz kein entsprechendes Grafikzeichen aufweisen (hexadezimale Zeichen 80-FF, , die im US-ASCII-codierten Zeichensatz nicht verwendet werden, sowie hexadezimale 00-1F und 7F, bei denen es sich um Steuerzeichen handelt), Leerzeichen, "%" (zum Codieren anderer Zeichen) und unsichere Zeichen (<, >, ", # , {, }, | , , , \ ^, ~, [ , und ] ').
Verwenden der WinINet-Funktionen zum Verarbeiten von URLs
In der folgenden Tabelle sind die URL-Funktionen zusammengefasst.
| Funktion | BESCHREIBUNG |
|---|---|
| InternetCanonicalizeUrl | Kanonisiert die URL. |
| InternetCombineUrl | Kombiniert Basis- und relative URLs. |
| InternetCrackUrl | Analysiert eine URL-Zeichenfolge in Komponenten. |
| InternetCreateUrl | Erstellt eine URL-Zeichenfolge aus Komponenten. |
| InternetOpenUrl | Beginnt mit dem Abrufen einer FTP-, HTTP- oder HTTPS-Ressource. |
Kanonisieren von URLs
Die Kanonisierung einer URL ist der Prozess, bei dem eine URL, die unsichere Zeichen wie Leerzeichen, reservierte Zeichen usw. enthalten kann, in ein akzeptiertes Format konvertiert wird.
Die InternetCanonicalizeUrl-Funktion kann zum Kanonisieren von URLs verwendet werden. Diese Funktion ist sehr aufgabenorientiert, daher sollte die Anwendung ihre Verwendung sorgfältig nachverfolgen. InternetCanonicalizeUrl überprüft nicht, ob die an sie übergebene URL bereits kanonisch ist und dass die zurückgegebene URL gültig ist.
Die folgenden fünf Flags steuern, wie InternetCanonicalizeUrl eine bestimmte URL behandelt. Die Flags können in Kombination verwendet werden. Wenn keine Flags verwendet werden, codiert die Funktion die URL standardmäßig.
| Wert | Bedeutung |
|---|---|
| _ICU-BROWSERMODUS _ | Codieren oder decodieren Sie keine Zeichen nach # " " oder "?", und entfernen Sie nach "?" keine nachgestellten Leerzeichen. Wenn dieser Wert nicht angegeben ist, wird die gesamte URL codiert, und nachfolgende Leerzeichen werden entfernt. |
| _ICU-DECODIERUNG | Konvertieren Sie alle %XX-Sequenzen in Zeichen, einschließlich Escapesequenzen, bevor die URL analysiert wird. |
| NUR _ ICU-CODIERUNG _ VON LEERZEICHEN _ | Nur Leerzeichen codieren. |
| ICU _ NO _ ENCODE | Konvertieren Sie unsichere Zeichen nicht in Escapesequenzen. |
| ICU _ NO _ META | Entfernen Sie keine Metasequenzen (z.B. "." und "..") aus der URL. |
Das _ ICU-DECODE-Flag sollte nur für kanonische URLs verwendet werden, da es davon ausgeht, dass alle %XX-Sequenzen Escapecodes sind, und konvertiert sie in die vom Code angegebenen Zeichen. Wenn die URL ein "%"-Symbol enthält, das nicht Teil eines Escapecodes ist, wird sie von ICU _ DECODE weiterhin als eins behandelt. Dieses Merkmal kann dazu führen, dass InternetCanonicalizeUrl eine ungültige URL erstellt.
Um InternetCanonicalizeUrl zum Zurückgeben einer vollständig decodierten URL zu verwenden, müssen die _ ICU-DECODE- und ICU _ NO _ ENCODE-Flags angegeben werden. Bei diesem Setup wird davon ausgegangen, dass die URL, die an InternetCanonicalizeUrl übergeben wird, zuvor kanonisch gemacht wurde.
Kombinieren von Basis- und relativen URLs
Ein relative URL ist eine kompakte Darstellung des Speicherorts einer Ressource relativ zu einer absoluten Basis-URL. Die Basis-URL muss dem Parser bekannt sein und umfasst in der Regel das Schema, die Netzwerkadresse und Teile des URL-Pfads. Eine Anwendung kann InternetCombineUrl aufrufen, um die relative URL mit ihrer Basis-URL zu kombinieren. InternetCombineUrl kanonisiert auch die resultierende URL.
Entleeren von URLs
Die InternetCrackUrl-Funktion trennt eine URL in ihre Komponententeile und gibt die Komponenten zurück, die durch die URL _ COMPONENTS-Struktur angegeben werden, die an die Funktion übergeben wird.
Die Komponenten, aus denen sich die URL _ COMPONENTS-Struktur zusammensetzt, sind Schemanummer, Hostname, Portnummer, Benutzername, Kennwort, URL-Pfad und zusätzliche Informationen (z. B. Suchparameter). Jede Komponente, mit Ausnahme des Schemas und der Portnummern, verfügt über einen Zeichenfolgenmember, der die Informationen enthält, und einen Member, der die Länge des Zeichenfolgenmembers enthält. Das Schema und die Portnummern verfügen nur über ein Element, das den entsprechenden Wert speichert. sie werden beide bei allen erfolgreichen Aufrufen von InternetCrackUrlzurü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 ungleich 0 (null) festgelegt werden. Der Zeichenfolgenmember kann entweder die Adresse eines Puffers oder NULL sein.
Wenn der Zeigermember die Adresse eines Puffers enthält, muss der Zeichenfolgenlängenmember die Größe dieses Puffers enthalten. InternetCrackUrl gibt die Komponenteninformationen als Zeichenfolge im Puffer zurück und speichert die Zeichenfolgenlänge im Zeichenfolgenlängenmember.
Wenn der Zeigermember NULL ist, kann der Zeichenfolgenlängenmember auf einen beliebigen Wert ungleich 0 (null) festgelegt werden. InternetCrackUrl speichert die Adresse des ersten Zeichens 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 für die Komponente gilt.
Alle Zeigermember, die auf NULL festgelegt sind, mit einem Memberpunkt ungleich 0 (null) zeigen auf den entsprechenden Startpunkt in der URL-Zeichenfolge. Die im Längenmember gespeicherte Länge muss verwendet werden, um das Ende der Informationen der einzelnen Komponente zu bestimmen.
Um die Initialisierung der URL _ COMPONENTS-Struktur ordnungsgemäß abzuschließen, muss der dwStructSize-Member auf die Größe der URL _ COMPONENTS-Struktur in Bytes festgelegt werden.
Im folgenden Beispiel werden die Komponenten der URL im Bearbeitungsfeld IDC _ PreOpen1 und die Komponenten an das Listenfeld IDC _ PreOpenList zurückgegeben. Um nur die Informationen für eine einzelne Komponente anzuzeigen, kopiert diese Funktion das Zeichen unmittelbar nach den Informationen der Komponente in der Zeichenfolge und ersetzt es vorübergehend durch einen NULL-Wert.
#include <windows.h>
#include <tchar.h>
#include <strsafe.h>
#include <wininet.h>
#include <stdlib.h>
#pragma comment(lib, "wininet.lib")
#pragma comment(lib, "user32.lib")
#define CRACKER_BUFFER_SIZE MAX_PATH
// For sample source code implementing the InternetErrorOut( )
// function referenced below, see the "Handling Errors" topic
// under "Using WinInet"
extern BOOL WINAPI InternetErrorOut( HWND hWnd, DWORD dwError,
LPCTSTR szFailingFunctionName );
// Forward declaration of listUrlPart helper functions:
BOOL listURLpart( HWND hDlg, int nListBoxID,
LPTSTR szPartName, LPTSTR part, DWORD partLength );
BOOL listURLpart( HWND hDlg, int nListBoxID,
LPTSTR szPartName, int partValue );
// Static list describing the URL Scheme types
// enumerated in INTERNET_SCHEME:
TCHAR* schemeType[] =
{
TEXT( "[Partial URL]" ), // 0
TEXT( "[Unknown scheme]" ), // 1
TEXT( "[Default scheme]" ), // 2
TEXT( "FTP" ), // 3
TEXT( "Gopher" ), // 4
TEXT( "HTTP" ), // 5
TEXT( "HTTPS" ), // 6
TEXT( "File" ), // 7
TEXT( "News" ), // 8
TEXT( "MailTo" ), // 9
TEXT( "Socks" ), // 10
TEXT( "JavaScript" ), // 11
TEXT( "VBScript" ) // 12
};
#define CRACKER_SCHEME_TYPE_ARRAY_SIZE 13
BOOL WINAPI Cracker( HWND hDlg, int nURLtextBoxId, int nListBoxId )
{
int i, j;
TCHAR* failedFunctionName;
TCHAR URL_buffer[CRACKER_BUFFER_SIZE];
URL_COMPONENTS URLparts;
URLparts.dwStructSize = sizeof( URLparts );
// The following elements determine which components are displayed
URLparts.dwSchemeLength = 1;
URLparts.dwHostNameLength = 1;
URLparts.dwUserNameLength = 1;
URLparts.dwPasswordLength = 1;
URLparts.dwUrlPathLength = 1;
URLparts.dwExtraInfoLength = 1;
URLparts.lpszScheme = NULL;
URLparts.lpszHostName = NULL;
URLparts.lpszUserName = NULL;
URLparts.lpszPassword = NULL;
URLparts.lpszUrlPath = NULL;
URLparts.lpszExtraInfo = NULL;
SendDlgItemMessage( hDlg, nListBoxId, LB_RESETCONTENT, 0, 0 );
if( !GetDlgItemText( hDlg, nURLtextBoxId,
URL_buffer, CRACKER_BUFFER_SIZE ) )
{
failedFunctionName = TEXT( "GetDlgItemText" );
goto CrackerError_01;
}
if( FAILED( StringCchLength( URL_buffer, CRACKER_BUFFER_SIZE,
(size_t*) &i ) ) )
{
failedFunctionName = TEXT( "StringCchLength" );
goto CrackerError_01;
}
if( !InternetCrackUrl( URL_buffer, (DWORD)_tcslen( URL_buffer ), 0,
&URLparts ) )
{
failedFunctionName = TEXT( "InternetCrackUrl" );
goto CrackerError_01;
}
failedFunctionName = TEXT( "listURLpart" );
i = URLparts.nScheme + 2;
if( ( i >= 0 ) && ( i < CRACKER_SCHEME_TYPE_ARRAY_SIZE ) )
{
StringCchLength( schemeType[i],
CRACKER_BUFFER_SIZE,
(size_t*) &j );
if( !listURLpart( hDlg, nListBoxId,
TEXT("Scheme type"),
schemeType[i], j ))
goto CrackerError_01;
}
if( !listURLpart( hDlg, nListBoxId, TEXT( "Scheme text" ),
URLparts.lpszScheme,
URLparts.dwSchemeLength ) ||
!listURLpart( hDlg, nListBoxId, TEXT( "Host name" ),
URLparts.lpszHostName,
URLparts.dwHostNameLength) ||
!listURLpart( hDlg, nListBoxId, TEXT( "Port number" ),
(int) URLparts.nPort ) ||
!listURLpart( hDlg, nListBoxId, TEXT( "User name" ),
URLparts.lpszUserName,
URLparts.dwUserNameLength) ||
!listURLpart( hDlg, nListBoxId, TEXT( "Password" ),
URLparts.lpszPassword,
URLparts.dwPasswordLength) ||
!listURLpart( hDlg, nListBoxId, TEXT( "Path" ),
URLparts.lpszUrlPath,
URLparts.dwUrlPathLength) ||
!listURLpart( hDlg, nListBoxId, TEXT( "Extra information"),
URLparts.lpszExtraInfo,
URLparts.dwExtraInfoLength))
goto CrackerError_01;
return( TRUE );
CrackerError_01:
// For sample source code of the InternetErrorOut( ) function
// referenced below, see the "Handling Errors"
// topic under "Using WinInet"
InternetErrorOut( hDlg, GetLastError( ), failedFunctionName );
return FALSE;
}
// listURLpart( ) helper function for string parts
BOOL listURLpart( HWND hDlg, int nListBoxId,
LPTSTR szPartName, LPTSTR part, DWORD partLength )
{
TCHAR outputBuffer[CRACKER_BUFFER_SIZE];
LPTSTR nextStart;
size_t nextSize;
if( partLength == 0 ) // Just skip empty ones
return( TRUE );
if( FAILED( StringCchCopyEx( outputBuffer,
(size_t) CRACKER_BUFFER_SIZE,
szPartName, &nextStart,
&nextSize, 0 ) ) ||
FAILED( StringCchCopyEx( nextStart, nextSize, TEXT( ": " ),
&nextStart, &nextSize, 0 ) ) ||
FAILED( StringCchCopyNEx( nextStart, nextSize, part,
(size_t) partLength,
&nextStart, &nextSize, 0 ) ) )
return( FALSE );
*nextStart = 0;
if( SendDlgItemMessage( hDlg, nListBoxId, LB_ADDSTRING, 0,
(LPARAM)outputBuffer ) < 0 )
return( FALSE );
return( TRUE );
}
// listURLpart( ) helper function for numeric parts
BOOL listURLpart( HWND hDlg, int nListBoxId,
LPTSTR szPartName, int partValue )
{
TCHAR outputBuffer[CRACKER_BUFFER_SIZE];
if( FAILED( StringCchPrintf( outputBuffer,
(size_t) CRACKER_BUFFER_SIZE,
TEXT( "%s: %d" ), szPartName,
partValue ) ) ||
( SendDlgItemMessage( hDlg, nListBoxId, LB_ADDSTRING, 0,
(LPARAM)outputBuffer ) < 0 ) )
return( FALSE );
return( TRUE );
}
Erstellen von URLs
Die InternetCreateUrl-Funktion verwendet die Informationen in der URL _ COMPONENTS-Struktur, um eine Uniform Resource Locator zu erstellen.
Die Komponenten, aus denen sich die URL _ COMPONENTS-Struktur zusammensetzt, sind Schema, Hostname, Portnummer, Benutzername, Kennwort, URL-Pfad und zusätzliche Informationen (z. B. Suchparameter). Jede Komponente mit Ausnahme der Portnummer verfügt über einen Zeichenfolgenmember, der die Informationen enthält, und einen Member, der die Länge des Zeichenfolgenmembers enthält.
Für jede erforderliche Komponente sollte der Zeigermember die Adresse des Puffers enthalten, der die Informationen enthält. Der Längenmember sollte auf 0 (null) festgelegt werden, wenn der Zeigermember die Adresse einer auf null endenden Zeichenfolge enthält. der Längenmember sollte auf die Zeichenfolgenlänge festgelegt werden, wenn der Zeigermember die Adresse einer Zeichenfolge enthält, die nicht auf null endet. Der Zeigermember aller Komponenten, die nicht erforderlich sind, muss NULL sein.
Direktes Zugreifen auf URLs
Auf FTP- und HTTP-Ressourcen im Internet kann direkt über die Funktionen InternetOpenUrl, InternetReadFileund InternetFindNextFile zugegriffen werden. InternetOpenUrl öffnet eine Verbindung mit der Ressource unter der URL, die an die Funktion übergeben wird. Wenn diese Verbindung hergestellt wird, gibt es zwei mögliche Schritte. Wenn es sich bei der Ressource um eine Datei handelt, kann sie von InternetReadFile heruntergeladen werden. Zweitens: Wenn es sich bei der Ressource um ein Verzeichnis handelt, kann InternetFindNextFile die Dateien innerhalb des Verzeichnisses auflisten (außer bei Verwendung von CERN-Proxys). Weitere Informationen zu InternetReadFilefinden Sie unter Lesen von Dateien. Weitere Informationen zu InternetFindNextFilefinden Sie unter Suchen der nächsten Datei.
Für Anwendungen, die über einen CERN-Proxy betrieben werden müssen, kann InternetOpenUrl für den Zugriff auf FTP-Verzeichnisse und -Dateien verwendet werden. Die FTP-Anforderungen werden so gepackt, dass sie wie eine HTTP-Anforderung aussehen, die der CERN-Proxy akzeptiert.
InternetOpenUrl verwendet das HINTERNET-Handle, das von der InternetOpen-Funktion erstellt wurde, und die URL der Ressource. Die URL muss das Schema (http:, ftp:, file: für eine lokale Datei oder https: für [ ] [ hypertext protocol secure) und den Netzwerkspeicherort (z. B. ] ) www.microsoft.com enthalten. Die URL kann auch einen Pfad enthalten (z. B. /isapi/gomscom.asp? TARGET=/windows/feature/) und Ressourcenname (z. B. default.htm). Für HTTP- oder HTTPS-Anforderungen können zusätzliche Header eingeschlossen werden.
InternetQueryDataAvailable, InternetFindNextFile, InternetReadFileund InternetSetFilePointer (nur HTTP- oder HTTPS-URLs) können das von InternetOpenUrl erstellte Handle verwenden, um die Ressource herunterzuladen.
Das folgende Diagramm veranschaulicht, welche Handles mit den einzelnen Funktionen verwendet werden.

Das von InternetOpen erstellte HINTERNET-Stammhandle wird von InternetOpenUrl verwendet. Das von InternetOpenUrl erstellte HINTERNET-Handle kann von InternetQueryDataAvailable, InternetReadFile, InternetFindNextFile (hier nicht gezeigt) und InternetSetFilePointer (nur HTTP- oder HTTPS-URLs) verwendet werden.
Weitere Informationen finden Sie unter HINTERNET Handles.
Hinweis
WinINet unterstützt keine Serverimplementierung. Darüber hinaus sollte sie nicht von einem Dienst verwendet werden. Verwenden Sie für Serverimplementierungen oder -dienste Microsoft Windows HTTP Services (WinHTTP).