本主題包含一個範例,說明如何撰寫腳本,以透過 Microsoft Windows HTTP Services (WinHTTP) 同步或非同步地取得資料。 此範例中示範的概念提供撰寫需要使用 HTTP 通訊協定存取數據的用戶端或仲介層伺服器應用程式的基礎。
必要條件和需求
除了Microsoft JScript 的工作知識之外,此範例還需要下列各項:
- Microsoft Windows 軟體開發工具包 (SDK) 的目前版本。
- 如果您的因特網連線是透過 Proxy 伺服器,則 Proxy 組態工具可建立 Microsoft Windows HTTP 服務 (WinHTTP) 的 Proxy 設定。 如需詳細資訊,請參閱 ProxyCfg.exe、Proxy 組態工具。
- 熟悉 網路術語 和概念。
同步擷取數據
若要建立以同步方式從網頁取得文字的腳本,請執行下列動作:
開啟文字編輯器。
將下列程式代碼複製到文字編輯器中。
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"));
將檔案儲存為 「Retrieve.js」。
在命令提示字元中,輸入 「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 以異步方式擷取數據與同步擷取數據非常類似。 進行兩個小變更,以修改上一節中的腳本。
將 Open 方法的第三個參數設定為 “true”,而不是將 “false” 設定為 ,以指定應該以異步方式執行 WinHTTP 方法。
// Create a HTTP request. var temp = WinHttpReq.Open("GET", strURL, true);
先叫用 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 方法也可以用來指定交易的逾時值。 選擇性參數可讓您以秒為單位指定逾時值。
相關主題