Delen via


Gegevens ophalen met behulp van script

Dit onderwerp bevat een voorbeeld van het schrijven van een script waarmee gegevens worden opgehaald via Microsoft Windows HTTP Services (WinHTTP) synchroon of asynchroon. De concepten die in dit voorbeeld worden gedemonstreerd, bieden de basis voor het schrijven van client- of middelste servertoepassingen die toegang tot gegevens vereisen met behulp van het HTTP-protocol.

Voorwaarden en vereisten

Naast een werkende kennis van Microsoft JScript is voor dit voorbeeld het volgende vereist:

  • De huidige versie van de Microsoft Windows Software Development Kit (SDK).
  • Het hulpprogramma voor proxyconfiguratie om de proxy-instellingen voor Microsoft Windows HTTP Services (WinHTTP) tot stand te brengen als uw verbinding met internet via een proxyserver is. Zie ProxyCfg.exe, een proxyconfiguratieprogrammavoor meer informatie.
  • Kennis van netwerkterminologie en concepten.

Gegevens synchroon ophalen

Ga als volgt te werk om een script te maken waarmee de tekst van een webpagina synchroon wordt opgehaald:

  1. Open een teksteditor.

  2. Kopieer de volgende code naar de teksteditor.

    function getText(strURL)
    {
        var strResult;
    
        try
        {
            // Create the WinHTTPRequest ActiveX Object.
            var WinHttpReq = new ActiveXObject(
                                      "WinHttp.WinHttpRequest.5.1");
    
            //  Create an HTTP request.
            var temp = WinHttpReq.Open("GET", strURL, false);
    
            //  Send the HTTP request.
            WinHttpReq.Send();
    
            //  Retrieve the response text.
            strResult = WinHttpReq.ResponseText;
        }
        catch (objError)
        {
            strResult = objError + "\n"
            strResult += "WinHTTP returned error: " + 
                (objError.number & 0xFFFF).toString() + "\n\n";
            strResult += objError.description;
        }
    
        //  Return the response text.
        return strResult;
    }
    
    WScript.Echo(getText("https://www.microsoft.com/default.htm"));
    
  3. Sla het bestand op als 'Retrieve.js'.

  4. Typ 'cscript Retrieve.js' in een opdrachtprompt en druk op Enter.

U hebt nu een script dat gebruikmaakt van een WinHttpRequest--object om de HTML-broncode voor de webpagina op https://www.microsoft.comte verkrijgen. Mogelijk moet u enkele seconden wachten totdat de code wordt weergegeven.

De toepassing bevat slechts één functie, getText. Met de eerste regel van het script wordt het WinHttpRequest--object gemaakt.

    // Create the WinHTTPRequest ActiveX Object.
    var WinHttpReq = new ActiveXObject("WinHttp.WinHttpRequest.5.1");

Wanneer de JScript-engine deze regel tegenkomt, wordt er een exemplaar van dit object gemaakt. Als u het foutbericht 'ActiveX-onderdeel kan geen object maken' ontvangt op deze regel, dan is de WinHttp.dll waarschijnlijk niet juist geregistreerd of niet aanwezig op het systeem.

De volgende regel van het script roept de methode Open aan.

    //  Create an HTTP request.
    WinHttpReq.Open("GET", "https://www.microsoft.com", false);

Drie parameters geven aan welke HTTP-werkwoord te gebruiken, de naam van de resource en of winHTTP synchroon of asynchroon moet worden gebruikt. In dit voorbeeld gebruikt de methode de HTTP-werkwoord'GET' om gegevens op te halen uit https://www.microsoft.com. Het opgeven van FALSE voor de laatste parameter bepaalt dat de transactie synchroon plaatsvindt. De methode Open maakt geen verbinding met de resource, zoals de naam kan impliceren. In plaats daarvan initialiseert het de interne gegevensstructuren die informatie over de sessie, verbinding en aanvraag onderhouden.

De methode Verzenden verzamelt de aanvraagheaders en verzendt de aanvraag. Wanneer deze wordt aangeroepen in de synchrone modus, wacht de methode Send ook op een antwoord voordat de toepassing kan doorgaan.

    // Send the HTTP request.
    WinHttpReq.Send();

Nadat de aanvraag is verzonden, retourneert het script de waarde van de eigenschap ResponseText van het WinHttpRequest-object. Deze eigenschap bevat het entiteitslichaam van de respons, namelijk de bron van een document.

    // Get the response text.
    return WinHttpReq.ResponseText;

De uitvoering van het script wordt onderbroken terwijl de volledige tekst van de resource wordt opgehaald. De resourcetekst wordt teruggegeven vanuit de functie en weergegeven.

Het WinHttpRequest object zorgt ervoor dat interne resources die zijn toegewezen voor de HTTP-transactie worden vrijgegeven.

Gegevens asynchroon ophalen

Het asynchroon ophalen van gegevens met Behulp van WinHTTP is vergelijkbaar met het synchroon ophalen van gegevens. Wijzig het script uit de vorige sectie door twee kleine wijzigingen aan te brengen.

  1. Stel de derde parameter van de methode Open in op 'true' in plaats van 'false' om op te geven dat WinHTTP-methoden asynchroon moeten worden uitgevoerd.

       //  Create a HTTP request.
        var temp = WinHttpReq.Open("GET", strURL, true);
    
  2. Roep de methode WaitForResponse aan voordat u de eigenschap ResponseText opent om ervoor te zorgen dat het hele antwoord is ontvangen.

        //  Send the HTTP request.
        WinHttpReq.Send();
    
        // Wait for the entire response.
        WinHttpReq.WaitForResponse();
    
        //  Retrieve the response text.
        strResult = WinHttpReq.ResponseText;
    

Het belangrijkste voordeel van het gebruik van WinHTTP asynchroon in het script is dat de methode Send onmiddellijk retourneert. De aanvraag wordt voorbereid en verzonden door een werkdraad. Hierdoor kan uw toepassing andere dingen doen terwijl er wordt gewacht op het antwoord. Voordat u toegang probeert te krijgen tot het antwoord, moet u ervoor zorgen dat het volledige antwoord is ontvangen door de methode WaitForResponse- aan te roepen. Anders kan er een fout optreden.

De methode WaitForResponse kan ook worden gebruikt om een time-outwaarde voor de transactie op te geven. Met een optionele parameter kunt u de time-outwaarde in seconden opgeven.

WinHttpRequest

HTTP/1.1-aanvraag voor opmerkingen (RFC 2616)