Freigeben über


Abrufen von Daten mithilfe des Skripts

Dieses Thema enthält ein Beispiel für das Schreiben eines Skripts, das Daten über Microsoft Windows HTTP Services (WinHTTP) entweder synchron oder asynchron abruft. Die in diesem Beispiel veranschaulichten Konzepte bieten die Grundlage für das Schreiben von Client- oder Serveranwendungen der mittleren Ebene, die zugriff auf Daten über das HTTP-Protokoll erfordern.

Voraussetzungen und Anforderungen

Zusätzlich zu den Kenntnissen von Microsoft JScript erfordert dieses Beispiel Folgendes:

  • Die aktuelle Version des Microsoft Windows Software Development Kit (SDK).
  • Das Proxykonfigurationstool zum Einrichten der Proxyeinstellungen für Microsoft Windows HTTP-Dienste (WinHTTP), wenn Ihre Verbindung mit dem Internet über einen Proxyserver besteht. Weitere Informationen finden Sie unter ProxyCfg.exe, ein Proxykonfigurationstool.
  • Vertrautheit mit Netzwerkterminologie und - konzepten.

Synchrones Abrufen von Daten

Gehen Sie wie folgt vor, um ein Skript zu erstellen, das den Text von einer Webseite synchron abruft:

  1. Öffnen Sie einen Text-Editor.

  2. Kopieren Sie den folgenden Code in den Text-Editor.

    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. Speichern Sie die Datei als "Retrieve.js".

  4. Geben Sie an einer Eingabeaufforderung "cscript Retrieve.js" ein, und drücken Sie die EINGABETASTE.

Sie verfügen jetzt über ein Skript, das ein WinHttpRequest-Objekt verwendet, um den HTML-Quellcode für die Webseite unter https://www.microsoft.comabzurufen. Möglicherweise müssen Sie einige Sekunden warten, bis der Code angezeigt wird.

Die Anwendung enthält nur eine Funktion, "getText". Die erste Zeile des Skripts erstellt das WinHttpRequest-Objekt .

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

Wenn die JScript-Engine auf diese Zeile stößt, wird eine instance dieses Objekts erstellt. Wenn Sie die Fehlermeldung "ActiveX-Komponente kann kein Objekt erstellen" in dieser Zeile erhalten, wurde die WinHttp.dll wahrscheinlich nicht ordnungsgemäß registriert oder ist nicht im System vorhanden.

In der nächsten Zeile des Skripts wird die Open-Methode aufgerufen.

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

Drei Parameter geben an, welches HTTP-Verb verwendet werden soll, den Namen der Ressource und ob WinHTTP synchron oder asynchron verwendet werden soll. In diesem Beispiel verwendet die -Methode das HTTP-Verb "GET", um Daten aus https://www.microsoft.comabzurufen. Die Angabe von FALSE für den letzten Parameter bestimmt, dass die Transaktion synchron erfolgt. Die Open-Methode stellt keine Verbindung mit der Ressource her, wie der Name vermuten lässt. Stattdessen werden die internen Datenstrukturen initialisiert, die Informationen zur Sitzung, Verbindung und Anforderung verwalten.

Die Send-Methode sammelt die Anforderungsheader und sendet die Anforderung. Wenn sie im synchronen Modus aufgerufen wird, wartet die Send-Methode auch auf eine Antwort, bevor die Anwendung fortgesetzt werden kann.

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

Nach dem Senden der Anforderung gibt das Skript den Wert der ResponseText-Eigenschaft des WinHttpRequest-Objekts zurück. Diese Eigenschaft enthält den Entitätstext der Antwort, in diesem Fall die Quelle eines Dokuments.

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

Die Ausführung des Skripts wird angehalten, während der gesamte Text der Ressource abgerufen wird. Der Ressourcentext wird von der Funktion zurückgegeben und angezeigt.

Das WinHttpRequest-Objekt stellt sicher, dass alle internen Ressourcen, die für die HTTP-Transaktion zugewiesen werden, freigegeben werden.

Asynchrones Abrufen von Daten

Das asynchrone Abrufen von Daten mit WinHTTP ähnelt dem synchronen Abrufen von Daten. Ändern Sie das Skript aus dem vorherigen Abschnitt, indem Sie zwei kleine Änderungen vornehmen.

  1. Legen Sie den dritten Parameter der Open-Methode auf "true" anstelle von "false" fest, um anzugeben, dass WinHTTP-Methoden asynchron ausgeführt werden sollen.

       //  Create a HTTP request.
        var temp = WinHttpReq.Open("GET", strURL, true);
    
  2. Rufen Sie die WaitForResponse-Methode auf, bevor Sie auf die ResponseText-Eigenschaft zugreifen, um sicherzustellen, dass die gesamte Antwort empfangen wurde.

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

Der Standard Vorteil bei der asynchronen Verwendung von WinHTTP im Skript besteht darin, dass die Send-Methode sofort zurückgegeben wird. Die Anforderung wird von einem Workerthread vorbereitet und gesendet. Dadurch kann Ihre Anwendung andere Aufgaben ausführen, während sie auf die Antwort wartet. Bevor Sie versuchen, auf die Antwort zuzugreifen, stellen Sie sicher, dass die gesamte Antwort empfangen wurde, indem Sie die WaitForResponse-Methode aufrufen. Andernfalls kann ein Fehler auftreten.

Die WaitForResponse-Methode kann auch verwendet werden, um einen Timeoutwert für die Transaktion anzugeben. Mit einem optionalen Parameter können Sie den Timeoutwert in Sekunden angeben.

WinHttpRequest

HTTP/1.1 Request for Comments (RFC 2616)