Web/HTTP 请求和自动化库
用于进行 HTTP 请求并支持会话状态持久性的库。支持 .NET、VBScript、JavaScript、C/C++ 和 Java。
引言
在过去一段时间开发 Web/HTTP 自动化时,我注意到 VBScript 和 .NET 中没有现成的解决方案可以进行 HTTP 请求并支持会话状态持久性。你可以在 .NET 的 WebRequest 或 WebClient 类中使用 Cookie,但要用它们支持会话状态,你需要自己编写包装器接口或库。VBScript 可以使用微软版本的 XmlHttpRequest
,但它本身不支持 Cookie,所以你必须自己编写接口或库。我确实找到一个支持 Cookie 和会话状态持久性的 VBScript 商业版本(见“资源”部分)。JavaScript 可以支持会话状态持久性,但你必须自己编写代码,或者使用许多现有的 AJAX 库之一。我个人觉得 AJAX 和使用 XmlHttpRequest
有点麻烦,当所有你真正想要的是进行一个简单的 HTTP 请求时。所以,我编写了一个简化的库来完成这个任务(它不是为 AJAX 或异步请求设计的),其灵感来自我在网上找到的一些 ASP.NET 代码(见“资源”部分)。
本文介绍了用于 .NET、VBScript 和 JavaScript 的简单易用的 HTTP 请求库,支持会话状态持久性。还为 C/C++ 和 Java 提供了一些选项和资源。文章分为几个部分,分别描述了每个语言/平台的库。
- .NET
- VBScript
- JavaScript
- C/C++
- Java
注意:这些库和配套文件按“原样”提供,仅通过本文的论坛提供有限支持。
背景
这是我文章 使用 Perl 进行 Web/HTTP 自动化 的后续。当时,最直接的解决方案是使用 Perl,因为它支持会话状态,而且我懂 Perl。现在,人们有了更多的选择。
.NET
我不得不承认,开发一个 .NET 网络/Web/HTTP 请求类等的包装器库似乎很有挑战性。而且我一直没时间去做。然而,在最近的网络搜索中,我发现了一个似乎能实现我设想的解决方案。与其重新发明轮子,我将引用这个解决方案供您探索。该解决方案包括源代码,但不提供预编译的库二进制文件。您可以自己编译一个,或者将代码文件包含到您的项目中。其中感兴趣的文件是 wwHTTP.cs。
VBScript
该库 (httpLib.vbs) 提供了一个微软实现的 XmlHttpRequest
的简单包装器。有了它,您无需了解 XmlHttpRequest
的细节。您只需要知道如何进行 GET 和 POST 请求。该库提供了两种方法。
httpGet(url, ByRef cookie, debug)
httpPost(url, data, ByRef cookie, debug)
这两种方法都非常简单易用。只需传入 URL,对于 POST 请求,还需要传入数据。数据参数遵循 var1=value1&var2=value2 的 GET/POST 数据格式。为了支持 Cookie 和会话状态,您可以(通过引用)提供一个 Cookie。Cookie 只是一个遵循 HTTP RFC Cookie 格式的文本字符串。要获得会话状态支持,您可以在第一个请求中传递一个空的 Cookie。HTTP 响应将返回一个有效的 Cookie,您可以将其用于后续请求以建立会话状态。如果您不需要 Cookie 或会话状态支持,请发送一个空的 Cookie 或 ""。debug 参数是一个布尔值,用于指示是否需要响应中的 HTTP 头部。如果设置为 true,则会连同响应内容一起返回头部,头部在前。如果设置为 false,则只返回响应内容。
该库可在 ASP、Windows Scripting Host 中使用,也可以通过 HTA 应用程序或 HTML 网页在 Internet Explorer 中使用。您只需要通过脚本标签引用该库。
为了简单起见,我将我 Perl 文章中的 Web 自动化解析脚本移植到了 VBScript。所以您可以使用它来像这样运行脚本:
cscript ParseHttpTrace.vbs <pathToTraceFile> <optionalPathForOutputScript>
有关如何使用此脚本的详细信息,请参阅“背景”部分提到的 Perl 文章,因为此脚本的作用与该文章相同,只是它生成的是 VBScript 代码。
JavaScript
该库 (xmlHttpLib.js) 提供了一个 XmlHttpRequest
的简单包装器。有了它,您无需了解 XmlHttpRequest
的细节。您只需要知道如何进行 GET 和 POST 请求。该库提供了两种方法。
httpGet(url, cookie, respType)
httpPost(url, data, cookie, respType)
这两种方法都非常简单易用。只需传入 URL,对于 POST 请求,还需要传入数据。数据参数遵循 var1=value1&var2=value2 的 GET/POST 数据格式。为了支持 Cookie 和会话状态,您可以提供一个 Cookie。Cookie 只是一个遵循 HTTP RFC Cookie 格式的文本字符串。要获得会话状态支持,您可以在第一个请求中传递一个空的 Cookie。HTTP 响应将返回一个有效的 Cookie,您可以将其用于后续请求以建立会话状态。如果您不需要 Cookie 或会话状态支持,请发送一个空的 Cookie 或 ""。respType
参数决定了从响应中返回的内容类型。此参数支持的有效值为:“text”、“xml”和“json”。使用 XML 或 JSON 时,返回的内容将是 XML DOM 或 JSON 对象,可立即使用。
HTTP 响应将返回到一个自定义对象中,该对象定义如下:
//Constructor for HTTP response object
function httpResp(sessionCookie, httpHeaders, content, status)
{
this.cookie = sessionCookie;
this.headers = httpHeaders;
this.content = content; //can be text, XML, or JSON
this.statusCode = status;
}
然后可以按如下方式访问响应参数:
myResp.cookie //can get/set this cookie value
myResp.content //can get/set this value for "text" return type
myResp.content.jsonObjMemberName //access JSON obj member
myResp.content.xmlDomMethodOrProperty //access result via XML DOM
为了避免在此文章中详细介绍如何支持 Cookie、会话状态持久性和 JSON,请参阅提供的示例脚本 (sampleJsUa.wsf),该脚本演示了这些功能的工作原理。不过,该脚本是一个 Windows Scripting Host 文件,所以您只能在 Windows 上运行它。最好使用 cscript 从命令行运行它,因为它会输出大量文本,您不希望使用 wscript 时弹出大量消息框。
为了简单和跨平台支持,该库包含三个附加方法:
xmlHttp()
print(txtStr)
xmlObj(text)
第一种方法将返回适合您平台的 XmlHttpRequest
对象(Windows/IE 或 Mozilla/Firefox)。第二种方法将根据平台输出或打印文本(在 Windows Scripting Host 中回显到命令行或显示弹出消息框,在浏览器中发送 alert()
,或为 ASP 写入 HTTP 响应)。第三种方法将返回适合您平台的 XML DOM 对象(Windows/IE 或 Mozilla/Firefox)。因此,可以说,该库可在 ASP、Windows Scripting Host、Internet Explorer HTA 应用程序或通过 Internet Explorer 或任何 Mozilla 浏览器运行的 HTML 网页中使用。您只需要通过脚本标签引用该库。
注意:此库不是 AJAX 库。它仅用于进行 HTTP 请求。
C/C++
我不是 C/C++ 库开发者,所以我这里不提供 C/C++ 版本,但我有一些信息可以帮助您进行 Web/HTTP 请求或开发自己的库。您可以尝试微软的 WinHTTP。它提供了一个 C/C++ API,并且看起来与 XmlHttpRequest
非常相似。它也提供了一个 COM 对象接口,但在此情况下,您也可以尝试 XmlHttpRequest
。您可以根据我在此处的 VBScript 和 JavaScript 库来构建自己的 API 或 COM 接口包装器。我可能会在未来的某个时候尝试开发一个 C/C++ 库,但这并不能保证。
Java
与 .NET 类似,Java 也有内置的网络/HTTP Web 请求和响应类。同样,它也不提供简单的类接口来管理 Cookie 支持的 HTTP 请求。我不得不承认,开发一个 Java 网络/Web/HTTP 请求类等的包装器库似乎很有挑战性。而且我一直没时间去做。然而,在最近的网络搜索中,我发现了一个似乎能实现我设想的解决方案。与其重新发明轮子,我将引用这个解决方案供您探索:HTTPClient (for Java)。
资源
- 这是我文章的后续:使用 Perl 进行 Web/HTTP 自动化。
- 我从以下博客获取了用于从 HTTP 请求中解析 Cookie 的原始源代码(这是开发这些库的基础):http://blog.netnerds.net/2006/04/asp-sustain-remote-cookie-sessions-in-an-asp-script-using-vbscript/
- 用于 VBScript 的商业 HTTP 请求库:http://www.tele-pro.co.uk/scripts/misc/httpsess.htm。
- .NET 实现的一个好的 Web/HTTP 请求库:WestWind Technologies 白皮书:在 .NET 中检索 HTTP 内容。
- 用于进行 Web/HTTP 请求的 C/C++ 选项:Windows HTTP Services (WinHTTP) MSDN 文档。
- Java 实现的一个好的 Web/HTTP 请求库:HTTPClient (for Java)。
历史
- 2007 年 7 月 14 日 - 文章初次发布,并发布了 VBScript 和 JavaScript 库的初始版本。
- 2007 年 10 月 27 日 - 修改了 JavaScript 库并更新了相关文章。
- 2008 年 11 月 21 日 - 文章更新,增加了 .NET、Java 和 C/C++ 的解决方案。
- 2010 年 1 月 8 日 - 文章更新,增加了 Java 解决方案。