使用脚本检索数据

本主题包含一个示例,说明如何编写通过 Microsoft Windows HTTP Services (WinHTTP) 同步或异步获取数据的脚本。 此示例中演示的概念为编写需要使用 HTTP 协议访问数据的客户端或中间层服务器应用程序提供了基础。

先决条件和要求

除了 Microsoft JScript 的实践知识外,此示例还要求满足以下条件:

  • Microsoft Windows 软件开发工具包的当前版本 (SDK) 。
  • 如果通过代理服务器连接到 Internet,则为 Microsoft Windows HTTP Services (WinHTTP) 建立代理设置的代理配置工具。 有关详细信息,请参阅 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. 在访问 ResponseText 属性之前调用 WaitForResponse 方法,以确保已收到整个响应。

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

在脚本中异步使用 WinHTTP main优点是 Send 方法会立即返回。 请求由工作线程准备和发送。 这使应用程序能够在等待响应时执行其他操作。 在尝试访问响应之前,请确保已通过调用 WaitForResponse 方法收到整个响应。 否则可能会发生错误。

WaitForResponse 方法还可用于指定事务的超时值。 使用可选参数可以指定以秒为单位的超时值。

WinHttpRequest

HTTP/1.1 征求意见 (RFC 2616)