65.9K
CodeProject 正在变化。 阅读更多。
Home

Web/HTTP 请求和自动化库

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.86/5 (9投票s)

2007年7月15日

CPOL

8分钟阅读

viewsIcon

57596

downloadIcon

778

用于进行 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)

资源

历史

  • 2007 年 7 月 14 日 - 文章初次发布,并发布了 VBScript 和 JavaScript 库的初始版本。
  • 2007 年 10 月 27 日 - 修改了 JavaScript 库并更新了相关文章。
  • 2008 年 11 月 21 日 - 文章更新,增加了 .NET、Java 和 C/C++ 的解决方案。
  • 2010 年 1 月 8 日 - 文章更新,增加了 Java 解决方案。
© . All rights reserved.