HTTP-Sitzungen
Mit WinINet können Sie auf Ressourcen auf der World Wide Web (WWW) zugreifen. Auf diese Ressourcen kann direkt über InternetOpenUrl zugegriffen werden (weitere Informationen finden Sie unter Direktes Zugreifen auf URLs).
Auf Ressourcen im WWW wird über HTTP zugegriffen. Die HTTP-Funktionen verarbeiten die zugrunde liegenden Protokolle und ermöglichen Ihrer Anwendung gleichzeitig den Zugriff auf Informationen im WWW. Mit der Weiterentwicklung des HTTP-Protokolls werden die zugrunde liegenden Protokolle aktualisiert, um das Funktionsverhalten aufrechtzuerhalten.
Das folgende Diagramm zeigt die Beziehungen der Funktionen, die mit dem HTTP-Protokoll verwendet werden. Die schattierten Felder stellen Funktionen dar, die HINTERNET-Handles zurückgeben, während die einfachen Felder Funktionen darstellen, die das HINTERNET-Handle verwenden, das von der Funktion erstellt wurde, von der sie abhängig sind.

Weitere Informationen finden Sie unter HINTERNET Handles.
Verwenden der WinINet-Funktionen für den Zugriff auf das WWW
- Initiieren einer Verbindung mit dem WWW
- Öffnen einer Anforderung
- Hinzufügen von Anforderungsheadern
- Senden einer Anforderung
- Bereitstellen von Daten an den Server
- Abrufen von Informationen zu einer Anforderung
- Herunterladen von Ressourcen aus dem WWW
Die folgenden Funktionen werden während HTTP-Sitzungen verwendet, um auf das WWW zuzugreifen.
| Funktion | BESCHREIBUNG |
|---|---|
| HttpAddRequestHeaders | Fügt dem HTTP-Anforderungshandle HTTP-Anforderungsheader hinzu. Diese Funktion erfordert ein handle, das von HttpOpenRequesterstellt wurde. |
| HttpOpenRequest | Öffnet ein HTTP-Anforderungshandle. Diese Funktion erfordert ein handle, das von InternetConnecterstellt wurde. |
| HttpQueryInfo | Fragt Informationen zu einer HTTP-Anforderung ab. Diese Funktion erfordert ein Handle, das von der HttpOpenRequest- oder InternetOpenUrl-Funktion erstellt wurde. |
| HttpSendRequest | Sendet die angegebene HTTP-Anforderung an den HTTP-Server. Diese Funktion erfordert ein handle, das von HttpOpenRequesterstellt wurde. |
| InternetErrorDlg | Zeigt vordefinierte Dialogfelder für häufige Internetfehlerbedingungen an. Diese Funktion erfordert das Handle, das im Aufruf von HttpSendRequestverwendet wird. |
Initiieren einer Verbindung mit dem WWW
Um eine Verbindung mit dem WWW zu starten, muss die Anwendung die InternetConnect-Funktion für das hinterNET-Stammverzeichnis aufrufen, das von InternetOpenzurückgegeben wird. InternetConnect muss eine HTTP-Sitzung einrichten, indem der _ _ INTERNET SERVICE-HTTP-Diensttyp deklariert wird. Weitere Informationen zur Verwendung von InternetConnectfinden Sie unter Verwenden von InternetConnect.
Öffnen einer Anforderung
Die HttpOpenRequest-Funktion öffnet eine HTTP-Anforderung und gibt ein HINTERNET-Handle zurück, das von den anderen HTTP-Funktionen verwendet werden kann. Im Gegensatz zu den anderen offenen Funktionen (z. B. FtpOpenFile und InternetOpenUrl)sendet HttpOpenRequest die Anforderung nicht an das Internet, wenn sie aufgerufen wird. Die HttpSendRequest-Funktion sendet die Anforderung und stellt eine Verbindung über das Netzwerk her.
HttpOpenRequest verwendet ein http-Sitzungshandle, das von InternetConnect erstellt wurde, sowie ein HTTP-Verb, einen Objektnamen, eine Versionszeichenfolge, einen Verweis, Akzeptieren von Typen, Flags und einen Kontextwert.
Das HTTP-Verb ist eine Zeichenfolge, die in der Anforderung verwendet werden soll. Häufige HTTP-Verben, die in Anforderungen verwendet werden, sind GET, PUT und POST. Wenn dieser Wert auf NULL festgelegt ist, verwendet HttpOpenRequest den Standardwert GET.
Der Objektname ist eine Zeichenfolge, die den Namen des Zielobjekts des angegebenen HTTP-Verbs enthält. Dies ist im Allgemeinen ein Dateiname, ein ausführbares Modul oder ein Suchspezifizierer. Wenn der angegebene Objektname eine leere Zeichenfolge ist, sucht HttpOpenRequest nach der Standardseite.
Die Versionszeichenfolge sollte die HTTP-Version enthalten. Wenn dieser Parameter NULL ist, verwendet die Funktion ""HTTP/1.1"".
Der Verweiser gibt die Adresse des Dokuments an, aus dem der Objektname abgerufen wurde. Wenn dieser Parameter NULL ist, wird kein Verweiser angegeben.
Die mit NULL beendete Zeichenfolge, die die Accept-Typen enthält, gibt die Inhaltstypen an, die von der Anwendung akzeptiert werden. Das Festlegen dieses Parameters auf NULL gibt an, dass von der Anwendung keine Inhaltstypen akzeptiert werden. Wenn eine leere Zeichenfolge angegeben wird, gibt die Anwendung an, dass sie nur Dokumente vom Typ ""text/ * "" akzeptiert. Der Wert ""text/" * gibt nur Textdokumente an– keine Bilder oder andere Binärdateien.
Die Flagwerte steuern das Zwischenspeichern, Cookies und Sicherheitsprobleme. Legen Sie für Microsoft Network (MSN), NTLM und andere Authentifizierungstypen das FLAG INTERNET FLAG KEEP _ _ _ CONNECTION fest.
Wenn das INTERNET _ FLAG _ ASYNC-Flag im Aufruf von InternetOpenfestgelegt wurde, sollte ein Kontextwert ungleich 0 (null) für einen ordnungsgemäßen asynchronen Vorgang festgelegt werden.
Das folgende Beispiel ist ein Beispielaufruf von HttpOpenRequest.
hHttpRequest = HttpOpenRequest( hHttpSession, "GET", "", NULL, "", NULL, 0, 0);
Hinzufügen von Anforderungsheadern
Mit der HttpAddRequestHeaders-Funktion können Anwendungen der ersten Anforderung mindestens einen Anforderungsheader hinzufügen. Mit dieser Funktion kann eine Anwendung zusätzliche Header im Freiformat an das HTTP-Anforderungshandle anfügen. Sie ist für die Verwendung durch anspruchsvolle Anwendungen vorgesehen, die eine genaue Kontrolle über die an den HTTP-Server gesendete Anforderung erfordern.
HttpAddRequestHeaders benötigt ein HTTP-Anforderungshandle, das von HttpOpenRequesterstellt wurde, eine Zeichenfolge, die die Header, die Länge der Header und modifizierer enthält.
Senden einer Anforderung
HttpSendRequest stellt eine Verbindung mit dem Internet her und sendet die Anforderung an den angegebenen Standort. Diese Funktion erfordert ein HINTERNET-Handle, das von HttpOpenRequesterstellt wurde. HttpSendRequest kann auch zusätzliche Header oder optionale Informationen senden. Die optionalen Informationen werden in der Regel für Vorgänge verwendet, die Informationen auf den Server schreiben, z. B. PUT und POST.
Nachdem HttpSendRequest die Anforderung gesendet hat, kann die Anwendung die Funktionen InternetReadFile, InternetQueryDataAvailableund InternetSetFilePointer auf dem HINTERNET-Handle verwenden, das von HttpOpenRequest erstellt wurde, um die Ressourcen des Servers herunterzuladen.
Bereitstellen von Daten auf dem Server
Um Daten an einen Server zu veröffentlichen, muss das HTTP-Verb im Aufruf von HttpOpenRequest entweder POST oder PUT sein. Die Adresse des Puffers, der die POST-Daten enthält, sollte dann an den lpOptional-Parameter in HttpSendRequestübergeben werden. Der dwOptionalLength-Parameter sollte auf die Größe der Daten festgelegt werden.
Sie können auch die InternetWriteFile-Funktion verwenden, um Daten in einem HINTERNET-Handle zu veröffentlichen, das mit httpSendRequestExgesendet wird.
Abrufen von Informationen zu einer Anforderung
HttpQueryInfo ermöglicht einer Anwendung das Abrufen von Informationen zu einer HTTP-Anforderung. Die Funktion erfordert ein HINTERNET-Handle, das von HttpOpenRequest oder InternetOpenUrlerstellt wurde, einen Wert auf Informationsebene und eine Pufferlänge. HttpQueryInfo akzeptiert auch einen Puffer, der die Informationen speichert, und einen nullbasierten Headerindex, der mehrere Header mit dem gleichen Namen aufzählt.
Herunterladen von Ressourcen aus dem WWW
Nachdem eine Anforderung mit HttpOpenRequest geöffnet und mit HttpSendRequestan den Server gesendet wurde, kann die Anwendung die Funktionen InternetReadFile, InternetQueryDataAvailableund InternetSetFilePointer verwenden, um die Ressource vom HTTP-Server herunterzuladen.
Im folgenden Beispiel wird eine Ressource heruntergeladen. Die Funktion akzeptiert das Handle für das aktuelle Fenster, die ID eines Bearbeitungsfelds und ein HINTERNET-Handle, das von HttpOpenRequest erstellt und von HttpSendRequestgesendet wird. Es verwendet InternetQueryDataAvailable, um die Größe der Ressource zu bestimmen, und lädt sie dann mit InternetReadFileherunter. Der Inhalt wird dann im Bearbeitungsfeld angezeigt.
int WINAPI Dumper(HWND hX, int intCtrlID, HINTERNET hResource)
{
LPTSTR lpszData; // buffer for the data
DWORD dwSize; // size of the data available
DWORD dwDownloaded; // size of the downloaded data
DWORD dwSizeSum=0; // size of the data in the textbox
LPTSTR lpszHolding; // buffer to merge the textbox data and buffer
// Set the cursor to an hourglass.
SetCursor(LoadCursor(NULL,IDC_WAIT));
// This loop handles reading the data.
do
{
// The call to InternetQueryDataAvailable determines the
// amount of data available to download.
if (!InternetQueryDataAvailable(hResource,&dwSize,0,0))
{
printf("InternetQueryDataAvailable failed (%d)\n", GetLastError());
SetCursor(LoadCursor(NULL,IDC_ARROW));
return FALSE;
}
else
{
// Allocate a buffer of the size returned by
// InternetQueryDataAvailable.
lpszData = new TCHAR[dwSize+1];
// Read the data from the HINTERNET handle.
if(!InternetReadFile(hResource,
(LPVOID)lpszData,
dwSize,
&dwDownloaded))
{
printf("InternetReadFile failed (%d)\n", GetLastError());
delete[] lpszData;
break;
}
else
{
// Add a null terminator to the end of the data buffer
lpszData[dwDownloaded]='\0';
// Allocate the holding buffer.
lpszHolding = new TCHAR[dwSizeSum + dwDownloaded + 1];
// Check if there has been any data written
// to the textbox.
if (dwSizeSum != 0)
{
// Retrieve the data stored in the textbox if any
GetDlgItemText(hX,intCtrlID,
(LPTSTR)lpszHolding,
dwSizeSum);
// Add a null terminator at the end of the
// textbox data.
lpszHolding[dwSizeSum]='\0';
}
else
{
// Make the holding buffer an empty string.
lpszHolding[0]='\0';
}
size_t cchDest = dwSizeSum + dwDownloaded + dwDownloaded + 1;
LPTSTR* ppszDestEnd = 0;
size_t* pcchRemaining = 0;
// Add the new data to the holding buffer
HRESULT hr = StringCchCatEx(lpszHolding,
cchDest,
lpszData,
ppszDestEnd,
pcchRemaining,
STRSAFE_NO_TRUNCATION);
if(SUCCEEDED(hr))
{
// Write the holding buffer to the textbox.
SetDlgItemText(hX,intCtrlID,(LPTSTR)lpszHolding);
// Delete the two buffers.
delete[] lpszHolding;
delete[] lpszData;
// Add the size of the downloaded data to the
// textbox data size.
dwSizeSum = dwSizeSum + dwDownloaded + 1;
// Check the size of the remaining data.
// If it is zero, break.
if (dwDownloaded == 0)
break;
else
{
// TODO: Insert error handling code here.
}
}
}
}
}
while(TRUE);
// Close the HINTERNET handle.
InternetCloseHandle(hResource);
// Set the cursor back to an arrow.
SetCursor(LoadCursor(NULL,IDC_ARROW));
return TRUE;
}
Hinweis
WinINet unterstützt keine Serverimplementierungen. Darüber hinaus sollte sie nicht von einem Dienst verwendet werden. Verwenden Sie für Serverimplementierungen oder -dienste Microsoft Windows HTTP-Dienste (WinHTTP).