SOAP 1.2 与 GET 请求

类别:Java 点击:0 评论:0 推荐:
出自:IBM 
SOAP 1.2 带来的变化进一步把 Web 服务编织到 Internet 的大网中。变化之一是 GET 方法的引入。GET 之所以重要是因为它支持各种优化。这一点已经过 Web 自身的验证,它广泛地使用 GET 方法。通过本技巧可以进一步了解这一点。

SOAP 1.0 发布以来,很多人曾经抱怨它对 HTTP POST 方法的依赖。许多人认为 SOAP 利用了一种流行的协议(HTTP),但一点也没有考虑和理解建立在其上的体系结构。

W3C 主持开发的 1.2 版本解决了这一问题。W3C 曾经在抽象该协议的许多方面花费了大力气,更容易通过各种不同的技术使用该协议。通过修订,SOAP 1.2 除了 HTTP 之外还支持 SMTP,并能更好的利用 HTTP。

关于 POST 方法
POST 有什么问题呢?简而言之,HTTP 定义了与服务器交互的不同方法,最基本的方法是 GET 和 POST。事实上 GET 适用于多数请求,而保留 POST 仅用于更新站点。根据 HTTP 规范,GET 用于信息获取,而且应该是安全的和幂等的。

在这里,所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET 请求一般不应产生副作用。幂等的意味着对同一 URL 的多个请求应该返回同样的结果。完整的定义并不像看起来那样严格。从根本上讲,其目标是当用户打开一个链接时,她可以确信从自身的角度来看没有改变资源。

比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。反之亦然。

POST 请求就不那么轻松了。POST 表示可能改变服务器上的资源的请求。仍然以新闻站点为例,读者对文章的注解应该通过 POST 请求实现,因为在注解提交之后站点已经不同了(比方说文章下面出现一条注解)。

GET 与 POST 之间的区别并不总是那么严格,也存在一些共性。许多站点在 POST 请求中封装了简单的信息获取,可能是因为开发人员认为这样对他来说更简单。

尽管关于 HTTP 方法的讨论看起来似乎是抽象的和理论性的,但并非如此。浏览器和中介软件(代理、防火墙和内容提交解决方案 la Akamai)根据区分不同请求能力来获得优化的性能(请参阅参考资料)。

SOAP 结盟 GET
SOAP 最初只支持 POST 请求。Web 服务仍然能够实现上述定义的安全服务。比如,查询订单进展情况的服务既是安全的也是幂等的。根据 HTTP 规范,它应该作为 GET 请求实现。而根据 SOAP 1.0 则必须使用 POST。

SOAP 1.2 引入了消息交换模式(Message Exchange Patterns,MEPs)和一种新的 HTTP 绑定。两者相结合就能实现答复 GET 请求的 Web 服务。MEP 描述了客户和服务器之间的交互模式。SOAP Request-Response MEP 是一种典型的 Web 服务交互:客户向服务器发出请求,服务器应答。

我将在这里进一步考察 SOAP Response MEP。MEP 只定义了一个响应而没有请求。在实践中,这意味着请求已经发出,但不是 SOAP 请求,只有响应是 SOAP。当与新的 HTTP 请求结合时,Response MEP 就可以支持 GET 请求。其工作原理如下:

客户发出 GET 请求。它把 Accept 头设为 application/soap+xml ,以便请求一个 SOAP 答复。 服务器答复,客户将响应作为正常的 SOAP 响应处理。

服务器通过 Accept 头区分 SOAP 请求和常规的 HTML 请求。客户可以在 Accept 中使用 q 属性设置不同的 content/type 表明自己的参数选择。

根据服务的需要,客户可以通过一般的 URL 编码方法(通常放在 ? 字符后)在 URL 中包含参数。比如,报告服务器场状态的服务可能不需要任何参数。按照定义,它返回当前服务器的状态。相反,报告产品可用性和价格的服务就需要产品标识符(或者名称)作为参数。

现在您可能迷惑客户如何知道调用哪个 URL 以及传递哪个参数,因为请求并不是 SOAP 的一部分。答案很简单:SOAP 服务器应该完成常规 Web 服务器所做的工作,并在上一次交互中包含该 URL。没有什么妨碍 GET 与 POST 的混合与匹配。

作为一个例子,想象一个处理办公用品(笔、纸、剪刀等等)订单的服务。该服务通过 SOAP 接收订单,显然这样的请求既不是安全的也不是幂等的,因此作为 POST 发出。服务器的响应可以包含一个 URL 来跟踪订单的处理过程。跟踪是安全的和幂等的,因此最好通过 GET 来实现。

Axis 与 WSDL 支持
在撰写本文的时候,Axis 仅仅支持 SOAP 1.1,但仍然实现了一种有限的 GET 形式。您可以通过它的 URL 调用任何请求,后面跟上一个 method 参数和其他参数。

比如,假设已经在 URL http://joker.psol.com/axis/order/Status.jws 实现了订单状态服务。该服务有两个方法,track 与 detailTrack,以订单号(onumber)作为参数。我可以通过 http://joker.psol.com/axis/order/Status.jws?method=track&onumber=56544322 调用该服务。

WSDL 2.0(W3C 正在开发)在操作定义中增加了 pattern 属性。该属性表明服务支持哪种 SOAP MEP(WSDL 调用 MEP 模式,因此不会在 SOAP 和 WSDL 之间产生混淆)。比如,跟踪服务可以像清单 1 那样定义。

清单 1. WSDL 摘录

<operation name="track" pattern="http://www.w3.org/2003/11/wsdl/out-only"> <output message="trackResponse"/> </operation>

结束语
Web 背后的简单原理已经证明了自身的灵活性与可靠性。作为 Web 服务中最重要的标准之一,SOAP 与这种取得非凡成功的体系结构的更密切结合,这是一种非常积极的进展。

在等待所青睐的工具包升级到 SOAP 1.2 和 WSDL 2.0 之前,先检查一下您的 Web 服务,识别出那些迁移到 GET 绑定时作为首要目标的安全操作。

参考资料 请参与 Benoit Marchal“使用 XML”专栏的讨论论坛。

了解 W3C 如何使 WSDL 2.0 跟上 SOAP 1.2 中的进展。

在 W3C 的 XML 协议工作组页面进一步了解 SOAP。

在 W3C 的站点上了解 HTTP 。

访问 Brian D. Davison 的 Web Caching and Content Delivery Resources,可以找到关于缓存、代理和内容传送的许多有用信息。

在“When to use GET?”一文中,Leigh Dodds 记载了 W3C 中关于向 SOAP 增加 GET 支持的讨论。

阅读 Russell Butek 的技巧文章“用 JAX-RPC 发送与接收 SOAP 消息”(developerWorks,2003 年 9 月)。

IBM WebSphere Studio Application Developer 是一种支持使用不同技术如 XML、JSPTM、Servlet、HTML、Web 服务、数据库和 EJB 等构建各种应用程序的开发工具。

在 developerWorks XML 专区可以找到更多 XML 资源。关于最新 XML 技巧的完整列表,请查看 实用技巧。

从 developerWorks 订阅每周一期的 Web 服务/XML 技巧邮件。

了解如何才能成为一名 IBM 认证的 XML 及相关技术的开发人员。

本文地址:http://com.8s8s.com/it/it12837.htm