使用 EXPath HTTP Client 处理 web 服务

利用 EXPath 测试 HTTP

EXPath 是一个社区驱动的成果,目标是为 XML 技术定义公共扩展,使开发人员更容易使用定义好的函数库创建可移植的应用程序。EXPath HTTP Client 模块定义一组函数,用于发送 HTTP 和 HTTPS 请求。学习使用这个库从 XSLT 和 XQuery 处理 HTTP,搞清楚如何使用一个用 XQuery 和 EXPath HTTP Client 模块构建的简单 HTTP tester 实用工具测试 HTTP 请求。

James R. Fuller, 技术主管, Webcomposite s.r.o.

Jim Fuller 的照片James Fuller 从事专业开发已经超过 15 年了,先后在他的祖国美国和英国的多家知名软件公司工作过。他与别人合作出版过几部技术书籍,经常就 XML 技术发表演说和撰写文章。他是 XML Prague 的发起人之一,并且是 EXSLT 的负责人之一。闲暇之余喜欢研究 XML 数据库 和 XQuery。



2011 年 3 月 28 日

EXPath 规范套件旨在跨各种 XML 技术协调公共函数的使用。EXPath 是开放的,每个人都可以为其做贡献,它为定义一些可积极地影响您使用 XML 标准的有用标准给出了一种替代方法 — 相对于由官方标准组织定义的标准,时间大大缩短。

常用缩写词

  • HTTP:超文本传输协议
  • HTTPS:基于安全套接字层的 HTTP
  • MIME:多用途互联网邮件扩展
  • REST:具象状态传输
  • SOAP:简单对象访问协议
  • SQL:结构化查询语言
  • URI:统一资源标识符
  • URL:统一资源定位符
  • XML:可扩展标记语言
  • XSLT:可扩展样式表语言转换

EXPath 由 XML 专家 Florent Georges 维护,它基于这样一个前提,即 XPath 从所有 XML 技术中脱颖而出,提供 XML 技术堆栈之下的大量功能。通过提供增强和扩展 XPath 的规范,能够以一致且严格的方式集成新的功能,设置在 XPath 数据模型环境中。

EXPath 首先是试图定义功能规范。然后再由社区基于这些规范构建实现。

现在是绝佳时期,赶紧加入争论,就您希望在这些 EXPath 模块最终版中看到的功能发表您的看法吧。参考资料 中有几个到该网站和相关邮件列表的链接。

EXPath HTTP Client 模块

EXPath HTTP Client 模块定义单个 http:send-request() 函数,用于创建和发送 HTTP 请求。http 前缀被绑定到 http://expath.org/ns/http-client 名称空间 URI。err 前缀定义错误元素,被绑定到 http://expath.org/ns/error 名称空间 URI。

http:send-request 函数用于利用任何一个 HTTP 动词(HTTP GETHTTP POSTHTTP PUTHTTP DELETE)生成 HTTP 请求。被调用时,该函数向指定的服务器发送一个 HTTP 请求并发出 HTTP 响应以及与 HTTP 连接有关的所有元数据。

http:send-request 有很多不同的识别标志可用:我喜欢使用下面这一个,在这里您传入一个 http:element,代表您想要发出的 HTTP 请求:

http:send-request($request as element(http:request))

EXPath 模块

很多 EXPath 模块的规范已经有了足够稳定的实现。那些正处于最活跃开发中的模块有:

  • HTTP Client。该模块为发送 HTTP 请求和处理响应定义一组函数。
  • Zip。该模块为读取 ZIP 文件结构、从 ZIP 文件中读取项目、更新现有 ZIP 文件中的项目或者创建新文件提供一组函数。
  • File Handling。该模块为读取和修改文件系统信息定义一组函数。用于读取文件、列出目录、创建它们以及获得关于文件的信息。
  • Packaging。这是几种核心 XML 技术(包括 XSLT、XQuery、XProc 和 XML Schema)的一个标准的打包系统。技术被打包之后,您可以将各个库部署在每台受支持的处理器上。
  • Webapp container。这是几种核心 XML 技术的一个标准的 web 应用程序容器和框架。

HTTP 请求

http:request 元素是一个围绕请求主体的包装器,包含几个发送 HTTP 请求所必需的属性:

  • methodHTTP getpostputdelete 或者任何其他 HTTP 动词。
  • href请求必须被发送到的 URI。
  • status-only响应如何出现。(为真的话,只返回状态代码和头部。)
  • auth-method定义 Basic 或 Digest 授权方法,在访问安全 URL 时使用。
  • send-authorization在使用 auth-method 时必须设置为 True。
  • username身份认证使用的用户名。
  • password身份认证使用的密码。
  • override-media-type覆盖 Content-Type 服务器返回的头部。
  • follow-redirect控制是否自动跟随 HTTP 重定向。
  • timeout等待服务器响应的最大秒数。

清单 1 展示了 http:request 元素是如何构造的,并且能够可选地包含其他元素,比如 http:header 元素和 http:body(如果有多方的话,或者是 http:multipart)。您使用 http:body 元素向服务器发送数据(POSTPUT)。如果只发送一个 HTTP GET,那么应该忽略 http:body 元素。

清单 1. http:request 元素
<http:request
     method = ncname 
     href? = uri 
     status-only? = boolean 
     username? = string 
     password? = string 
     auth-method? = string 
     send-authorization? = boolean 
     override-media-type? = string 
     follow-redirect? = boolean 
     timeout? = integer> 
     (http:header*,
     (http:multipart| http:body)?) 
</http:request>

您使用 http:header 元素定义您想要一起发送的定制的 HTTP 头部。例如要将您的 HTTP 请求与用户代理关联,您可以定义 <http:header name="User-Agent" value="My HTTP Tester/1.0"/>

<http:header name = string value = string/>

http:request 元素可以包含一个 http:body 元素,如 清单 2 所示。该元素包含您想要发送到服务器的内容。例如,要发送一个 HTTP POST,可以在该元素中放置 name=value 对。

清单 2. http:body 元素
<http:body
     media-type = string 
     src? = uri 
     method? = "xml" | "html" | "xhtml" | "text" | "binary" | qname-but-not-ncname 
     byte-order-mark? = "yes" | "no"
     cdata-section-elements? = qnames 
     doctype-public? = string 
     doctype-system? = string
     encoding? = string 
     escape-uri-attributes? = "yes" | "no" indent? = "yes" | "no"
     normalization-form? = "NFC" | "NFD" | "NFKC" | "NFKD" | "fully-normalized" 
        | "none" | nmtoken 
     omit-xml-declaration? = "yes" | "no" 
     standalone? = "yes" | "no" | "omit"
     suppress-indentation? = qnames 
     undeclare-prefixes? = "yes" | "no" 
     output-version? = nmtoken> any* 
</http:body>

http:body 元素与 HTTP POSTPUT 一起使用,它指定一些属性,用于定义 HTTP 主体如何被处理和发送:

  • media-type主体部分的 MIME 媒体类型。
  • src不是内联,您可以将主体内容指定为另一个 URI。
  • method主体的格式(xmlhtmlxhtmltextbinary)。
  • cdata-section-elements指定将被编码为 CDATA 节的元素。
  • doctype-public定义主体公共文档类型。
  • doctype-system定义主体系统文档类型。
  • encoding主体的字符编码。
  • indent指定主体是否在发送之前自动缩进。
  • omit-xml-declaration指定是否在主体中排除 XML 声明。
  • suppress-indentation指定 indent 属性设置为 True 时不缩进的元素。

如果阅读 EXPath HTTP 规范,您会发现更多的属性。要知道,有些属性还处于开发中,所以我只包含那些已经明确定义好了的属性。

目前已展示的代码演示了组成完整的 HTTP 请求的所有组件。HTTP 协议也为利用 HTTP 请求发送文件提供了功能。一般来说,HTTP 对待多方消息主体与对待任何其他媒体类型没什么区别,如 清单 3 所示:严格地作为有效载荷(单独的 HTTP 请求)。用于定义 EXPath HTTP 的元素是 http:multipart

清单 3. http:multipart 元素
<http:multipart media-type = string
     boundary? = string>
     (http:header*,
     http:body)+
     </http:multipart>

由于该元素定义一个单独的 HTTP 请求(子请求),所以您使用 media-type 来为该请求定义媒体类型。boundary 属性定义边界标记(用于分隔包含在嵌套的 http:body 中的多方消息的不同部分)。

HTTP 响应

http:send-request() 函数被调用之后,它返回一个序列,第一项是 http:response 元素,后面的一些项包含 HTTP 响应的主体(参见 清单 4)。

清单 4. 一个 http:response 元素示例
<http:response 
status = integer 
message = string> 
(http:header*)
</http:response> 

.... HTTP Response body ....

status 属性指出从服务器返回的 HTTP RESPONSE STATUS 码(例如,200)。http:response 元素包含从服务器返回的 HTTP 响应头部、多方和主体。


开始

EXPath 成果主要关注于定义规范,不一定提供 EXPath 模块功能的实现。幸运的是,现在可从 EXPath HTTP Client 模块页面得到 EXPath HTTP Client 的一些参考实现供使用:

  • Saxon。作为一个 EXPath 包 (.xar) 安装。
  • eXist。作为一个 EXPath 包安装,或者直接使用 XQuery 库。
  • Zorba。内置在 Zorba XQuery 处理器中的一个实现。
  • MarkLogic Server。用作 XQuery 库。
  • Microsoft® .NET Framework。通过 myxsl.net ASP.net 扩展而提供。

由于标准还在发展演变中,所以实现可能会不稳定。确保在生产设置中使用任何这些模块之前检查基本的操作。

XSLT 示例

通过从 XSLT 转换中调用 HTTP 请求,将您学到的关于 EXPath HTTP Client 模块的知识付诸实践。您使用出自 Michael Kay 的 SAXON XSLT 和 XQuery 处理器(Saxon version 9.2)作为 XSLT 处理器。

要安装 EXPath HTTP Client 实现,需要使用另一个有用的 EXPath 模块,即 EXPath Packaging System,它自动地安装模块。要安装客户端,可执行以下步骤:

  1. 下载 EXPath Packaging module for SAXON
  2. 下载 EXPath HTTP Client module for SAXON
  3. 安装 EXPath Packaging 模块(按照 README 文件)。
  4. 使用 EXPath Packaging 模块,部署 EXPath HTTP Client XAR 包。

只要通过定义 XPath HTTP Client 名称空间并调用 http:send-request 函数,您的 SAXON 处理器就应该能够访问新功能,如 清单 5 所示。

清单 5. XSLT 中调用的一个 HTTP GET 示例
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:http="http://expath.org/ns/http-client" version="2.0"> <xsl:template
name="main"> <xsl:variable name="req" as="element()"> <http:request
     href="http://neo.jpl.nasa.gov/risk/" method="get"/>
</xsl:variable> <xsl:copy-of
select="http:send-request($req)[2]"/> </xsl:template>
</xsl:stylesheet>

此代码对 URL http://neo.jpl.nasa.gov/risk/ 发出一个 HTTP GET 请求,顺便提一下,这是一个专门评估靠近地球的环地轨道小行星的影响风险。这个 HTTP GET 请求相当于您从浏览器请求 web 页面。您可以将 href 属性更改为任何有效的(且可访问的)web URL。

从函数返回的 http:response 元素包含 HTTP 响应元素,后者又包含 http:header 元素,后跟实际被请求的 web 页面内容。清单 6 展示了代码。

清单 6. 来自 http://neo.jpl.nasa.gov/risk/ 的 HTTP 响应
<http:response
xmlns:http="http://expath.org/ns/http-client" 
status="200"> 
<http:header name="Date" value="Sun, 14 Nov 2010 10:37:34 GMT"/> 
<http:header name="Server" value="Apache"/> <http:header 
          name="Accept-Ranges" value="bytes"/> 
<http:header name="Transfer-Encoding" value="chunked"/>
<http:header name="Content-Type" value="text/html"/> 
<http:body media-type="text/html"/> 
</http:response> 
... actual web page ....

由于您对返回实际的 web 页面感兴趣,所以在 http:send-request 函数上使用了一个谓词,用于选择所返回序列中的第二项:

http:send-request($req)[2]

XQuery 示例

通过引用与本文示例下载绑定在一起的 EXPath HTTP Client xquery 库实现 —http-client.xqm,从 eXist XML 数据库中调用您的函数。

您需要在作为 XQuery 文件下载的 eXist XML 数据库的实例中运行 清单 7。如果无法安装数据库,您不必担心:稍后我提供一种使用 Zorba XQuery 处理器的“自由安装”方法。

清单 7. XQuery 示例
import module namespace http = "http://expath.org/ns/http-client" at "http-client.xqm"; 
let $url:= 'http://neo.jpl.nasa.gov/risk/' 
let $req := <http:request href="{$url}" method="get"/> 
return 
     http:send-request($req)[1]

开发人员对导入 XQuery 库更熟悉一些(EXPath Packaging 是一个较新的标准),我对本文中大多数例子都使用这种方法。

不是返回 web 页面,跟 XSLT 例子一样,选择只返回序列中的第一项:http:response 元素。清单 8 展示了这一元素。

清单 8. http:response 元素
<http:response xmlns:http="http://expath.org/ns/http-client" status="200"> 
     <http:header name="Date" value="Sun, 14 Nov 2010 10:37:34 GMT"/> 
     <http:header name="Server" value="Apache"/> 
     <http:header name="Accept-Ranges" value="bytes"/> 
     <http:header name="Transfer-Encoding" value="chunked"/>
     <http:header name="Content-Type" value="text/html"/> 
     <http:body media-type="text/html"/> 
</http:response>

现在,来看这个相同的例子运行在 Zorba XQuery 处理器中。为此,简单地使用 Zorba XQuery 处理器在线实况演示,所以您无需安装任何东西。让浏览器指向 http://try.zorba-xquery.com,然后将 清单 9 中的代码粘贴到 web 页面中提供的区域。

清单 9. Zorba 示例
import module namespace http = "http://expath.org/ns/http-client"; 
let $url := 'http://neo.jpl.nasa.gov/risk/'
let $req := <http:request href="{$url}" method="get"/>
return 
     http:send-request($req)[1]

代码中惟一需要更改的地方是 import module 声明,因为 EXPath HTTP Client 是内置在 Zorba 中的。图 1 展示了示例在浏览器中的样子。(查看图 1 的 大图。)

图 1. 在 Zorba 中尝试 EXPath HTTP Client 示例
Zorba 实况演示中 EXPath HTTP cient 示例的屏幕截图

单击 Execute 以通过在线 Zorba XQuery 处理器运行该脚本。得到与 eXist XML 数据库示例中相同的 http:response

这种跨处理器的一致性不仅仅在于避免可怕的供应商锁定(vendor lock-in):它也在于花较少的时间学习另一种新的起作用的识别标志,将更多的时间用于构建优质的 web 应用程序。


HTTP tester

既然已经基本了解 EXPath HTTP Client 模块,就使用它来构建一个普通的基于 web 的 HTTP tester,您可以用来测试发送 HTTP 请求。在构建 HTTP tester 过程中,我设立了一个挑战,看我能否在 15 分钟内构建完成。尽管这个 tester 没有赢得设计奖项,但是我为创建简单的 HTTP tester 是如此地容易且快速而感到惊讶。我不介绍实现的细节,说一句话就够了:尽管它可以充当您自己的编程起点,但是它还有太多的改进空间。

跟您预期的一致,tester 的核心是 http:send-request 函数。其他所有内容只是帮助您构成 http:request 元素。要安装 tester,请将以下文件上传到您的 eXist XML 数据库:

  • expath-http.xqm。用于 eXist XML 的 EXPath HTTP Client XQuery 库。
  • index.xqy。简单的 HTTP tester。

HTTP tester 被构建来与 eXist XML 数据库一起使用:要安装它,请将它上传到数据库。您可以通过使用 eXist XML 数据库 RESTful 界面并将浏览器指向 index.xqy 而访问 HTTP tester。

http://localhost:8080/exist/rest/db/expath-http/index.xqy

如果一切正常,您会看到类似于 图 2 的界面。(查看图 2 的 大图。)

图 2. HTTP tester
HTTP tester 的屏幕截图,带有 HTTP 请求和 HTTP 响应

测试 web 服务

既然有了一个普通的 tester,那么针对您可能找到的任何 web 服务,尝试所有重要的 HTTP 动词并定义您想要发送的头部和内容。我下面总结了 URL 方法以及预期的 http:requesthttp:response 元素:

  • MarkMail。该服务提供一个有用的到流行邮件列表归档的查询接口。MarkMail 提供各种提要,您可以访问其中一种。该提要代表进入归档的最近电子邮件的列表。Atom 是实现良好的 RESTful web 服务的一个很好的例子,本例展示了 EXPath HTTP 客户端如何轻松地与之协作(参见 清单 10)。
    清单 10. MarkMail
    Method: HTTP GET 
    URL: http://markmail.markmail.org/atom/ 
    
    <http:request xmlns:http="http://expath.org/ns/http-client" method="get" 
    href="http://markmail.markmail.org/atom/" 
    username="" password="" auth-method="" 
    send-authorization="false" 
    follow-redirect="true" timeout="30"/>
    
    <http:response xmlns:http="http://expath.org/ns/http-client" status="200">
    <http:header name="Content-Type" value="application/atom+xml"/>
    <http:header name="Date" value="Sun, 14 Nov 2010 12:00:52"/>
    <http:header name="Expires" value="Sun, 14 Nov 2010 12:57:52"/>
    <http:header name="Cache-Control" value="public"/>
    <http:header name="Server" value="MarkLogic"/>
    <http:header name="Content-Length" value="209931"/>
    <http:header name="X-Cache" value="MISS from cache-2.a.markmail.biz"/>
    <http:header name="Via" value="1.0 cache-2.a.markmail.biz:80 (squid)"/>
    <http:header name="Connection" value="close"/>
    <http:body content-type="application/atom+xml"/>
    </http:response>
  • Yahoo! YQL。Yahoo! 提供一种类似于 SQL 的 SELECT 语法,叫做 Yahoo! Query Language (YQL),用于查询宿主在 Yahoo! 上的所有种类的数据。YQL 让您跨 web 服务查询、过滤和连结数据。您可以使用 EXPath 来直接访问此数据(参见 清单 11)。
    清单 11. Yahoo! YQL
    Method: HTTP GET 
    URL: http://query.yahooapis.com/v1/public/yql?q=select * from 
      weather.forecast where location=90210&diagnostics=true
    
    <http:request xmlns:http="http://expath.org/ns/http-client" method="get" 
         href="http://query.yahooapis.com/v1/public/yql?
               q=select%20*%20from%20weather.
               forecast%20where%20location%3D90210&diagnostics=true" 
         username="" password="" auth-method="" send-authorization="false" 
         follow-redirect="true" timeout="30"/>
    
    <http:response xmlns:http="http://expath.org/ns/http-client" status="200">
         <http:header name="Date" value="Sun, 14 Nov 2010 13:45:51 GMT"/>
         <http:header name="P3P" value="policyref="http://info.yahoo.com/w3c/p3p.xml", 
             CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi 
             OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT 
             DEM CNT STA POL HEA PRE LOC GOV""/>
         <http:header name="Access-Control-Allow-Origin" value="*"/>
         <http:header name="Cache-Control" value="public, max-age=1199"/>
         <http:header name="Vary" value="Accept-Encoding"/>
         <http:header name="Content-Type" value="text/xml;charset=utf-8"/>
         <http:header name="Age" value="0"/>
         <http:header name="Transfer-Encoding" value="chunked"/>
         <http:header name="Connection" value="keep-alive"/>
         <http:header name="Server" value="YTS/1.19.4"/>
         <http:body content-type="text/xml;charset=utf-8"/>
    </http:response>
  • London gold price。该服务为获得当前金价提供一个 SOAP 接口。处理 SOAP 通常意味着需要添加特定的 HTTP 头部(比如 SOAPaction),本例展示了从 EXPath HTTP Client 模块处理 SOAP 有多么容易。参见 清单 12
    清单 12. London gold price
    Method: HTTP POST 
    URL: http://www.webservicex.net/LondonGoldFix.asmx
    HEADER:  SOAPAction = http://www.webservicex.net/GetLondonGoldAndSilverFix
    BODY: <soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
       xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soap:Body>
    <GetLondonGoldAndSilverFix xmlns="http://www.webservicex.net"/>
    </soap:Body>
    </soap:Envelope>
    
    <http:request xmlns:http="http://expath.org/ns/http-client" 
      method="post" href="http://www.webservicex.net/LondonGoldFix.asmx" 
    username="" password="" auth-method="" send-authorization="false" 
      follow-redirect="true" timeout="30">
    <http:header name="SOAPAction" 
      value="http://www.webservicex.net/GetLondonGoldAndSilverFix"/>
    <http:body content-type="text/xml">
    <soap:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soap:Body>
    <GetLondonGoldAndSilverFix xmlns="http://www.webservicex.net"/>
    </soap:Body>
    </soap:Envelope>
    </http:body>
    </http:request>

结束语

由于这是一篇简介性文章,所以我只关注利用 EXPath HTTP client 能够做些什么,不去探究跟 HTTP 协议有关的疑难问题。从 http:requesthttp:body 元素可选属性的数量,复杂程度可窥一斑;但是在一般实践中,这些属性很少用到。

很多 XQuery 和 XPath 处理器有它们自己用于发出 HTTP 请求的扩展。使用 EXPath HTTP Client 模块可以使您的代码跨此类处理器更加可移植。

现在还处于 EXPath 成果的生命早期,但是像 EXPath HTTP Client 这样的模块已经显示了良好的前景,我推荐您尝试一下这些模块,加入邮件列表,并参与讨论。


下载

描述名字大小
示例下载文件src.zip7KB

参考资料

学习

  • EXPath:找到 EXPath 规范套件。
  • EXPath 邮件列表:通过邮件列表讨论 EXPath,并为之贡献代码。
  • EXQuery:发现 EXQuery 规范套件。
  • EXProc:查找 EXProc 规范套件。
  • Atom processing with Zorba:阅读这篇写得不错的关于在 Zorba XQuery 处理器中使用 EXPath HTTP Client 模块的文章。
  • 作者的更多文章(James R. Fuller,开发人员,2008 年 6 月至今):阅读关于 XProc、XQuery、Atom XML、Firefox XUL 和其他技术的文章。
  • developerWorks XML 专区:在 XML 专区获取提高您的专业技能所需的资源。
  • Web 开发新手入门:开始在 developerWorks 上了解动态 Web 应用程序及更多内容。
  • My developerWorks:个性化您的 developerWorks 体验。
  • IBM XML 认证:了解如何才能成为一名 IBM 认证的 XML 和相关技术的开发人员。
  • XML 技术库:访问 developerWorks XML 专区,获得广泛的技术文章和技巧、教程、标准和 IBM 红皮书。此外,阅读更多的 XML 技巧
  • developerWorks 技术活动网络广播:随时关注这些活动中的技术。
  • developerWorks 播客:收听面向软件开发人员的有趣访谈和讨论。
  • developerWorks 演示中心:观看演示,包括面向初学者的产品安装和设置演示,以及为经验丰富的开发人员提供的高级功能。

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=XML, SOA and web services
ArticleID=643481
ArticleTitle=使用 EXPath HTTP Client 处理 web 服务
publish-date=03282011