HTTP-sessioner
Med WinINet kan du komma åt resurser på World Wide Web (WWW). Dessa resurser kan nås direkt med hjälp av InternetOpenUrl (mer information finns i Åtkomst till URL:er direkt).
Resurser på WWW nås med hjälp av http. HTTP-funktionerna hanterar de underliggande protokollen, samtidigt som programmet kan komma åt information på WWW. När HTTP-protokollet utvecklas uppdateras de underliggande protokollen för att upprätthålla funktionsbeteendet.
Följande diagram visar relationerna mellan de funktioner som används med HTTP-protokollet. De skuggade rutorna representerar funktioner som returnerar HINTERNET- referenser, medan de oformaterade rutorna representerar funktioner som använder HINTERNET- handtag som skapats av den funktion som de är beroende av.
Mer information finns i HINTERNET-handtag.
Använda WinINet Functions för att komma åt WWW
- initiera en anslutning till WWW-
- Öppna en
- lägga till
- Skicka en begäran
- att publicera data till server
- hämta information om en begäran
- Ladda ned resurser från WWW-
Följande funktioner används under HTTP-sessioner för att komma åt WWW.
Funktion | Beskrivning |
---|---|
HttpAddRequestHeaders | Lägger till HTTP-begärandehuvuden i HTTP-begärandehandtaget. Den här funktionen kräver ett handtag som skapats av HttpOpenRequest. |
HttpOpenRequest | Öppnar en HTTP-begärandereferens. Den här funktionen kräver ett handtag som skapats av InternetConnect. |
HttpQueryInfo | Frågar efter information om en HTTP-begäran. Den här funktionen kräver ett handtag som skapats av funktionen HttpOpenRequest eller InternetOpenUrl. |
HttpSendRequest | Skickar den angivna HTTP-begäran till HTTP-servern. Den här funktionen kräver ett handtag som skapats av HttpOpenRequest. |
InternetErrorDlg | Visar fördefinierade dialogrutor för vanliga Internetfelvillkor. Den här funktionen kräver handtaget som används i anropet för att HttpSendRequest. |
Initiera en anslutning till WWW
Om du vill starta en anslutning till WWW måste programmet anropa funktionen InternetConnect på rotfunktionen HINTERNET som returneras av InternetOpen. InternetConnect måste upprätta en HTTP-session genom att deklarera INTERNET_SERVICE_HTTP tjänsttyp. Mer information om hur du använder InternetConnectfinns i Using InternetConnect.
Öppna en begäran
Funktionen HttpOpenRequest öppnar en HTTP-begäran och returnerar en HINTERNET- referens som kan användas av de andra HTTP-funktionerna. Till skillnad från andra öppna funktioner (till exempel FtpOpenFile och InternetOpenUrl), skickar HttpOpenRequest inte begäran till Internet när den anropas. Funktionen HttpSendRequest skickar begäran och upprättar en anslutning via nätverket.
HttpOpenRequest tar ett HTTP-sessionshandtag som skapats av InternetConnect och ett HTTP-verb, objektnamn, versionssträng, referent, acceptera typer, flaggor och kontextvärde.
HTTP-verbet är en sträng som ska användas i begäran. Vanliga HTTP-verb som används i begäranden är GET, PUT och POST. Om värdet är inställt på NULL-använder HttpOpenRequest standardvärdet GET.
Objektnamnet är en sträng som innehåller namnet på det angivna HTTP-verbets målobjekt. Det här är vanligtvis ett filnamn, en körbar modul eller en sökspecificerare. Om det angivna objektnamnet är en tom sträng letar HttpOpenRequest efter standardsidan.
Versionssträngen ska innehålla HTTP-versionen. Om den här parametern är NULL-använder funktionen "HTTP/1.1".
Referensen anger adressen till dokumentet som objektnamnet hämtades från. Om den här parametern är NULL-anges ingen referens.
Den null--terminated-strängen som innehåller accepttyperna anger de innehållstyper som godkänts av programmet. Om du anger den här parametern till NULL- anges att inga innehållstyper godkänns av programmet. Om en tom sträng anges anger programmet att det endast accepterar dokument av typen "text/*". Värdet "text/*" anger endast textdokument – inte bilder eller andra binära filer.
Flaggvärdena styr cachelagring, cookies och säkerhetsproblem. För Microsoft Network (MSN), NTLM och andra typer av autentisering anger du flaggan INTERNET_FLAG_KEEP_CONNECTION.
Om flaggan INTERNET_FLAG_ASYNC angavs i anropet till InternetOpenbör ett icke-nollkontextvärde anges för korrekt asynkron åtgärd.
Följande exempel är ett exempelanrop till HttpOpenRequest.
hHttpRequest = HttpOpenRequest( hHttpSession, "GET", "", NULL, "", NULL, 0, 0);
Lägga till begärandehuvuden
Funktionen HttpAddRequestHeaders gör det möjligt för program att lägga till en eller flera begärandehuvuden i den första begäran. Med den här funktionen kan ett program lägga till ytterligare sidhuvuden i fritt format i HTTP-begärandehandtaget. den är avsedd för användning av avancerade program som kräver exakt kontroll över begäran som skickas till HTTP-servern.
HttpAddRequestHeaders behöver ett HTTP-begärandehandtag som skapats av HttpOpenRequest, en sträng som innehåller rubrikerna, längden på rubrikerna och modifierarna.
Skicka en begäran
HttpSendRequest upprättar en anslutning till Internet och skickar begäran till den angivna platsen. Den här funktionen kräver ett HINTERNET--handtag som skapats av HttpOpenRequest. HttpSendRequest- kan också skicka ytterligare rubriker eller valfri information. Den valfria informationen används vanligtvis för åtgärder som skriver information till servern, till exempel PUT och POST.
När HttpSendRequest har skickat begäran kan programmet använda InternetReadFile, InternetQueryDataAvailableoch InternetSetFilePointer funktioner på HINTERNET- handtag som skapats av HttpOpenRequest för att ladda ned serverns resurser.
Publicera data till servern
Om du vill publicera data till en server måste HTTP-verbet i anropet till HttpOpenRequest vara antingen POST eller PUT. Adressen till bufferten som innehåller POST-data ska sedan skickas till parametern lpOptional i HttpSendRequest. Parametern dwOptionalLength ska anges till datastorleken.
Du kan också använda funktionen InternetWriteFile för att publicera data på en HINTERNET--handtag som skickas med hjälp av HttpSendRequestEx.
Hämta information om en begäran
HttpQueryInfo gör att ett program kan hämta information om en HTTP-begäran. Funktionen kräver en HINTERNET- handtag som skapats av HttpOpenRequest eller InternetOpenUrl, ett informationsnivåvärde och en buffertlängd. HttpQueryInfo accepterar också en buffert som lagrar informationen och ett nollbaserat huvudindex som räknar upp flera rubriker med samma namn.
Ladda ned resurser från WWW
När du har öppnat en begäran med HttpOpenRequest och skickat den till servern med HttpSendRequestkan programmet använda InternetReadFile, InternetQueryDataAvailableoch InternetSetFilePointer funktioner för att ladda ned resursen från HTTP-servern.
I följande exempel laddas en resurs ned. Funktionen accepterar handtaget till det aktuella fönstret, identifieringsnumret för en redigeringsruta och en HINTERNET--handtag som skapats av HttpOpenRequest och skickats av HttpSendRequest. Den använder InternetQueryDataAvailable för att fastställa resursens storlek och laddar sedan ned den med hjälp av InternetReadFile. Innehållet visas sedan i redigeringsrutan.
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;
}
Not
WinINet stöder inte serverimplementeringar. Dessutom bör den inte användas från en tjänst. För serverimplementeringar eller tjänster använder du Microsoft Windows HTTP Services (WinHTTP).