Delen via


HTTP-sessies

Met WinINet kunt u toegang krijgen tot resources op het World Wide Web (WWW). Deze resources kunnen rechtstreeks worden geopend met behulp van InternetOpenUrl- (zie Url's rechtstreeks openen).

Bronnen op de WWW zijn toegankelijk via http. De HTTP-functies verwerken de onderliggende protocollen, terwijl uw toepassing toegang heeft tot informatie op www. Naarmate het HTTP-protocol zich ontwikkelt, worden de onderliggende protocollen bijgewerkt om het gedrag van de functie te behouden.

In het volgende diagram ziet u de relaties van de functies die worden gebruikt met het HTTP-protocol. De gearceerde vakken vertegenwoordigen functies die ACHTERNET ingangen retourneren, terwijl de vakken zonder opmaak functies vertegenwoordigen die gebruikmaken van de ACHTERNET ingang die zijn gemaakt door de functie waarvan ze afhankelijk zijn.

wininet-functies die worden gebruikt voor http-

Zie ACHTERNET Handlesvoor meer informatie.

De WinINet-functies gebruiken voor toegang tot www

De volgende functies worden gebruikt tijdens HTTP-sessies voor toegang tot www.

Functie Beschrijving
HttpAddRequestHeaders- Voegt HTTP-aanvraagheaders toe aan de HTTP-aanvraaghandler. Voor deze functie is een ingang vereist die is gemaakt door HttpOpenRequest-.
HttpOpenRequest- Hiermee opent u een HTTP-aanvraaghandgreep. Voor deze functie is een ingang vereist die is gemaakt door InternetConnect.
HttpQueryInfo- Query's uitvoeren op informatie over een HTTP-aanvraag. Voor deze functie is een ingang vereist die is gemaakt door de HttpOpenRequest- of internetOpenUrl- functie.
HttpSendRequest- Verzendt de opgegeven HTTP-aanvraag naar de HTTP-server. Voor deze functie is een ingang vereist die is gemaakt door HttpOpenRequest-.
InternetErrorDlg- Hiermee worden vooraf gedefinieerde dialoogvensters weergegeven voor algemene internetfoutvoorwaarden. Voor deze functie is de ingang vereist die in de aanroep wordt gebruikt om httpSendRequestte.

 

Een verbinding met www initiƫren

Als u een verbinding met www wilt starten, moet de toepassing de functie InternetConnect aanroepen op de hoofdmap ACHTERNET- geretourneerd door InternetOpen. InternetConnect- moet een HTTP-sessie tot stand brengen door het INTERNET_SERVICE_HTTP servicetype te declareren. Zie InternetConnect gebruikenvoor meer informatie over het gebruik van InternetConnect.

Een aanvraag openen

De functie HttpOpenRequest opent een HTTP-aanvraag en retourneert een ACHTERNET ingang die kan worden gebruikt door de andere HTTP-functies. In tegenstelling tot de andere open functies (zoals FtpOpenFile en InternetOpenUrl), stuurt HttpOpenRequest de aanvraag niet naar internet wanneer deze wordt aangeroepen. De httpSendRequest-functie verzendt de aanvraag en brengt een verbinding tot stand via het netwerk.

HttpOpenRequest gebruikt een HTTP-sessiehandgreep die is gemaakt door InternetConnect- en een HTTP-woord, objectnaam, versietekenreeks, referrer, accepteren van typen, vlaggen en contextwaarde.

Het HTTP-werkwoord is een tekenreeks die moet worden gebruikt in de aanvraag. Veelvoorkomende HTTP-woorden die worden gebruikt in aanvragen zijn GET, PUT en POST. Als deze waarde is ingesteld op NULL-, gebruikt HttpOpenRequest de standaardwaarde GET.

De objectnaam is een tekenreeks die de naam van het opgegeven doelobject van het HTTP-werkwoord bevat. Dit is doorgaans een bestandsnaam, een uitvoerbare module of een zoekaanduiding. Als de opgegeven objectnaam een lege tekenreeks is, zoekt HttpOpenRequest naar de standaardpagina.

De versietekenreeks moet de HTTP-versie bevatten. Als deze parameter is NULL-, gebruikt de functie http/1.1.

De verwijzer geeft het adres op van het document waaruit de objectnaam is verkregen. Als deze parameter is NULL-, wordt er geen verwijzing opgegeven.

De null-tekenreeks-terminated die de accepttypen bevat, geeft de inhoudstypen aan die door de toepassing worden geaccepteerd. Als u deze parameter instelt op NULL- geeft aan dat er geen inhoudstypen worden geaccepteerd door de toepassing. Als er een lege tekenreeks wordt opgegeven, geeft de toepassing aan dat deze alleen documenten van het type ""text/*" accepteert. De waarde ""text/*"" geeft alleen tekstdocumenten aan, niet afbeeldingen of andere binaire bestanden.

De vlagwaarden bepalen caching, cookies en beveiligingsproblemen. Stel voor Microsoft Network (MSN), NTLM en andere typen verificatie de vlag INTERNET_FLAG_KEEP_CONNECTION in.

Als de INTERNET_FLAG_ASYNC vlag is ingesteld in de aanroep naar InternetOpen, moet een niet-nulcontextwaarde worden ingesteld voor de juiste asynchrone bewerking.

Het volgende voorbeeld is een voorbeeldaanroep voor HttpOpenRequest-.

hHttpRequest = HttpOpenRequest( hHttpSession, "GET", "", NULL, "", NULL, 0, 0);

Aanvraagheaders toevoegen

Met de functie HttpAddRequestHeaders kunnen toepassingen een of meer aanvraagheaders toevoegen aan de eerste aanvraag. Met deze functie kan een toepassing extra headers met vrije indeling toevoegen aan de HTTP-aanvraaghandler; het is bedoeld voor gebruik door geavanceerde toepassingen waarvoor nauwkeurige controle nodig is over de aanvraag die naar de HTTP-server wordt verzonden.

HttpAddRequestHeaders heeft een HTTP-aanvraaghandgreep nodig die is gemaakt door HttpOpenRequest, een tekenreeks die de headers, de lengte van de headers en modifiers bevat.

Een aanvraag verzenden

HttpSendRequest maakt verbinding met internet en stuurt de aanvraag naar de opgegeven site. Voor deze functie is een ACHTERNET- handle vereist die is gemaakt door HttpOpenRequest-. HttpSendRequest kan ook extra headers of optionele informatie verzenden. De optionele informatie wordt over het algemeen gebruikt voor bewerkingen die gegevens naar de server schrijven, zoals PUT en POST.

Nadat HttpSendRequest de aanvraag heeft verzonden, kan de toepassing de functies InternetReadFile, InternetQueryDataAvailableen InternetSetFilePointer functies op de ACHTERSTENET- verwerken die zijn gemaakt door HttpOpenRequest- om de resources van de server te downloaden.

Gegevens plaatsen op de server

Als u gegevens naar een server wilt posten, moet het HTTP-woord in de aanroep naar HttpOpenRequest POST of PUT zijn. Het adres van de buffer die de POST-gegevens bevat, moet vervolgens worden doorgegeven aan de parameter lpOptional in HttpSendRequest. De parameter dwOptionalLength moet worden ingesteld op de grootte van de gegevens.

U kunt ook de functie InternetWriteFile gebruiken om gegevens te posten op een ACHTERNET handle verzonden met behulp van HttpSendRequestEx-.

Informatie over een aanvraag ophalen

HttpQueryInfo kan een toepassing informatie over een HTTP-aanvraag ophalen. De functie vereist een ACHTERNET- ingang die is gemaakt door HttpOpenRequest of InternetOpenUrl, een waarde op informatieniveau en een bufferlengte. HttpQueryInfo accepteert ook een buffer waarmee de informatie en een op nul gebaseerde headerindex worden opgeslagen waarin meerdere headers met dezelfde naam worden opgesomd.

Bronnen downloaden van de WWW

Nadat u een aanvraag hebt geopend met HttpOpenRequest en deze naar de server hebt verzonden met HttpSendRequest, kan de toepassing de InternetReadFile-, InternetQueryDataAvailableen InternetSetFilePointer--functies gebruiken om de resource van de HTTP-server te downloaden.

In het volgende voorbeeld wordt een resource gedownload. De functie accepteert de ingang in het huidige venster, het identificatienummer van een invoervak en een ACHTERNET- handle gemaakt door HttpOpenRequest en verzonden door HttpSendRequest. Er wordt gebruikgemaakt van InternetQueryDataAvailable om de grootte van de resource te bepalen en deze vervolgens te downloaden met InternetReadFile-. De inhoud wordt vervolgens weergegeven in het invoervak.

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;
}

Notitie

WinINet biedt geen ondersteuning voor serverimplementaties. Daarnaast mag deze niet worden gebruikt vanuit een service. Voor server-implementaties of -services wordt Microsoft Windows HTTP Services (WinHTTP)gebruikt.