Share via


使用腳本擷取資料

本主題包含如何撰寫腳本,透過 Microsoft Windows HTTP 服務 (WinHTTP) 同步或非同步取得資料的腳本。 此範例中示範的概念提供撰寫需要使用 HTTP 通訊協定存取資料的用戶端或仲介層伺服器應用程式的基礎。

必要條件和需求

除了 Microsoft JScript 的工作知識之外,此範例還需要下列各項:

  • Microsoft Windows 軟體發展工具組的目前版本 (SDK) 。
  • 如果您的網際網路連線是透過 Proxy 伺服器,Proxy 組態工具可建立 Microsoft Windows HTTP Services (WinHTTP) 的 Proxy 設定。 如需詳細資訊,請參閱 Proxy 組態工具ProxyCfg.exe
  • 熟悉 網路術語 和概念。

同步擷取資料

若要建立以同步方式從網頁取得文字的腳本,請執行下列動作:

  1. 開啟文字編輯器。

  2. 將下列程式碼複製到文字編輯器中。

    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. 將檔案儲存為 「Retrieve.js」。

  4. 在命令提示字元中,輸入 「cscript Retrieve.js」,然後按 ENTER 鍵。

您現在有使用 WinHttpRequest 物件的腳本,以取得網頁 https://www.microsoft.com 的 HTML 原始程式碼。 您可能必須等候數秒,程式碼才會出現。

應用程式只包含一個函式 「getText」。 腳本的第一行會建立 WinHttpRequest 物件。

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

當 JScript 引擎遇到這一行時,它會建立這個物件的實例。 如果您收到錯誤訊息:「ActiveX 元件無法建立物件」,則在此行上,最有可能是WinHttp.dll未正確註冊或不存在於系統上。

腳本的下一行會呼叫 Open 方法。

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

三個參數會指定要使用的 HTTP 動詞動詞 、資源的名稱,以及是否以同步或非同步方式使用 WinHTTP。 在此範例中,方法使用 HTTP 動詞「GET」 從 https://www.microsoft.com 取得資料。 為最後一個參數指定 FALSE 會決定交易會同步發生。 Open方法不會建立與資源的連線,因為名稱可能表示。 相反地,它會初始化內部資料結構,以維護會話、連線和要求的相關資訊。

Send方法會組合要求標頭,並傳送要求。 在同步模式中呼叫時, Send 方法也會等候回應,再允許應用程式繼續。

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

傳送要求之後,腳本會傳回WinHttpRequest物件的ResponseText屬性值。 此屬性包含回應的實體本文,在此案例中為檔的來源。

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

擷取資源的整個文字時,腳本的執行會暫停。 資源文字會從 函式傳回並顯示。

WinHttpRequest物件可確保已配置給 HTTP 交易的任何內部資源都已釋放。

以非同步方式擷取資料

使用 WinHTTP 以非同步方式擷取資料與同步擷取資料非常類似。 藉由進行兩個小型變更,修改上一節中的腳本。

  1. Open 方法的第三個參數設定為 「true」,而不是 「false」,以指定應該以非同步方式執行 WinHTTP 方法。

       //  Create a HTTP request.
        var temp = WinHttpReq.Open("GET", strURL, true);
    
  2. 先叫用 WaitForResponse 方法,再存取 ResponseText 屬性,以確保已收到整個回應。

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

在腳本中以非同步方式使用 WinHTTP 的主要優點是 Send 方法會立即傳回。 要求是由背景工作執行緒準備並傳送。 這可讓您的應用程式在等候回應時執行其他動作。 嘗試存取回應之前,請先呼叫 WaitForResponse 方法,確定已收到整個回應。 否則會發生錯誤。

WaitForResponse方法也可用來指定交易的逾時值。 選擇性參數可讓您以秒為單位指定逾時值。

WinHttpRequest

HTTP/1.1 批註要求 (RFC 2616)