SOAP 1.2 与 GET 请求
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 方法的讨论看起来似乎是抽象的和理论性的,但并非如此。浏览器和中介软件(代理、防火墙和内容提交解决方案 laAkamai)根据区分不同请求能力来获得优化的性能(请参阅 参考资料)。
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 来实现。
Web 背后的简单原理已经证明了自身的灵活性与可靠性。作为 Web 服务中最重要的标准之一,SOAP 与这种取得非凡成功的体系结构的更密切结合,这是一种非常积极的进展。
在等待所青睐的工具包升级到 SOAP 1.2 和 WSDL 2.0 之前,先检查一下您的 Web 服务,识别出那些迁移到 GET 绑定时作为首要目标的安全操作。
SOAP 1.2
从编程模型的角度而言,SOAP 1.1 和 SOAP 1.2 之间并没有太多的差异。作为 Java 程序员,您只会在使用处理程序时遇到这些差异,我们将在以后的技巧文章中对如何处理这种情况进行讨论。SAAJ 1.3 已更新以支持 SOAP 1.2。
XML/HTTP
与 SOAP 1.2 的更改类似,从编程模型的角度而言,SOAP/HTTP 和 XML/HTTP 消息之间并没有太多的差异。作为 Java 程序员,您只会在使用处理程序时遇到这些差异,我们将在以后的技巧文章中对如何处理这种情况进行讨论。HTTP 绑定具有自己的处理程序链和自己的一组消息上下文属性。
WS-I Basic Profiles
JAX-RPC 1.1 支持 WS-I Basic Profile (BP) 1.0。从那时起,WS-I 人员就完成了 BP 1.1(以及关联的 AP 1.0 和 SSBP 1.0)的开发。这些新概要阐明了一些小要点,更明确地定义了附件。JAX-WS 2.0 支持这些较新的概要。在大部分情况下,其间的差异并不会影响 Java 编程模型。不过附件除外。WS-I 不仅处理了有关附件的一些问题,而且还定义了自己的 XML 附件类型:wsi:swaRef。
很多人都被这些概要搞糊涂了。为了弄清楚其间的问题,将需要了解一下其相关历史。
WS-I 的第一个基本概要 (BP 1.0) 在阐明各个规范方面做得非常不错,但它并不完美。尤其对 SOAP with Attachments (Sw/A) 的支持仍然相当不明确。在第二个工作循环中,WS-I 人员将附件从基本概要 (BP 1.1) 中分离出来,并对第一版中一些没有讨论的内容进行了补充。当时他们还添加了两个互不包括的基本概要补充文档:AP 1.0 和 SSBP 1.0。AP 1.0 是附件概要 (Attachment Profile),描述如何使用 Sw/A。SSBP 1.0 是简单 SOAP 绑定概要 (Simple SOAP Binding Profile),描述并不支持 Sw/A 的 Web 服务引擎(如 Microsoft 的 .NET)。WS-I 所提供的其他概要文件都是以这些基本概要文件为基础构建的。
Java 5
对 Java 语言进行了一系列更改。JAX-WS 依赖于:Annotation、通用函数和执行程序。我们将在后续的技巧文章中具体讨论 JAX-WS 如何依赖于这个新功能。有关 Java 的这些新功能的信息,请参见参 考资料中的 Java 5 链接。
总结
JAX-WS 2.0 是 JAX-RPC 1.1 的后续版本。其中有些内容保持不变,但大部分编程模型都或多或少有些不同。本技巧文章中介绍的主题将在一系列技巧文章中展开讨论,这个系列的文章对 JAX-WS 和 JAX-RPC 间的区别进行了详细的讨论,我们将在随后的数月中陆续发布。大致看来,可能会因为以下这些原因而决定从 JAX-RPC 迁移到 JAX-WS,或保持不变。
希望继续使用 JAX-RPC 1.1 的原因:
升级到 JAX-WS 2.0 的原因: