- 浏览: 914660 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (537)
- Java SE (114)
- Struts (18)
- Hibernate (25)
- Spring (3)
- Page_Tech (41)
- Others (87)
- Database (29)
- Server (24)
- OpenSource_Tools (15)
- IDE_Tool (22)
- Algorithm (28)
- Interview (22)
- Test (28)
- Hardware (1)
- Mainframe (25)
- Web application (4)
- Linux (3)
- PHP (17)
- Android (1)
- Perl (6)
- ubuntu (1)
- Java EE (9)
- Web Analysis (5)
- Node.js (2)
- javascript (2)
最新评论
-
一键注册:
request.getRequestURL()和request.getRequestURI() -
SuperCustomer:
...
SED的暂存空间和模式空间 -
juyo_ch:
讲得挺好理解的,学习了
java 死锁及解决 -
chinaalex:
最后一题答案正确,但是分析有误.按照如下过程,上一行为瓶,下一 ...
zz智力题 -
liaowuxukong:
多谢博主啦,弱弱的了解了一点。
C++/Java 实现多态的方法(C++)
SOAP的全称是Simple Object Access Protocol,即简单对象访问协议。
一、SOAP简介
如前所述,SOAP用XML作为数据编码格式。用XML作为数据编码格式并非SOAP的原创,实际上这是一种相当自然的选择。XML-RPC和ebXML也同样使用XML。要了解这方面的更多信息,请参见本文最后的“参考资源”。
请考虑下面的Java接口:
Listing 1 public interface Hello { public String sayHelloTo(String name); } |
客户程序在调用sayHelloTo()方法时提供了一个名字,它希望从服务器接收到一则个性化的“Hello”信息。现在,假定RMI、CORBA和DCOM都不存在,开发者必须负责串行化方法调用,并把消息发送给远程机器。几乎所有的人都会说“这该使用XML”,我同意。因此,让我们先从对服务器的请求格式开始。假设要模拟sayHelloTo("John")调用,我打算发送的请求是:
Listing 2 <?xml version="1.0"?> <Hello> <sayHelloTo> <name>John</name> </sayHelloTo> </Hello> |
在这里,我把接口的名字作为根结点。另外,我还把方法名字和参数名字都当作节点。接下来,我们要把这个请求发送给服务器。我们不创建自己的TCP/IP消息,而是使用HTTP。因此,下面的步骤应该是把请求封装成HTTP POST请求格式,然后把它发送给服务器。实际创建该HTTP POST请求的详细过程在本文后面介绍,现在,我们先假定它已经创建完毕。服务器接收到了这个请求,解码XML,然后再以XML格式向客户程序发送应答。假设应答内容如下:
Listing 3 <?xml version="1.0"?> <Hello> <sayHelloToResponse> <message>Hello John, How are you?</message> </sayHelloToResponse> </Hello> |
根节点仍然是接口的名字Hello。但这一次,原来对应着方法的节点名字不再是sayHelloTo,而是方法的名字加上“Response”字符串。客户程序知道自己调用了哪一个方法,要找出被调用方法的返回值,它只需查看名字为方法名字加上“Response”字符串的元素。
以上就是SOAP的根本思路。Listing 4显示了同一请求用SOAP XML编码之后的结果:
Listing 4 <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema"> <SOAP-ENV:Header> </SOAP-ENV:Header> <SOAP-ENV:Body> <ns1:sayHelloTo xmlns:ns1="Hello" SOAP-ENV:encodingStyle=" http://schemas.xmlsoap.org/soap/encoding/"> <name xsi:type="xsd:string">John</name> </ns1:sayHelloTo> </SOAP-ENV:Body> </SOAP-ENV:Envelope> |
看起来稍微复杂了一点,对吧?实际上,它和我们前面编写的请求类似,只是略微扩展了一些东西。首先,注意SOAP文档通过一个Envelope(根节点)、一个Header区、一个Body区,整洁地组织到一起。Header区用来封装那些与方法本身无直接关系的数据,提供环境方面的信息,比如事务ID和安全信息。Body区包含面向方法本身的信息。在Listing 2中,我们自己编写的XML只包含一个Body区。
第二,注意Listing 4大量地应用了XML名称空间。SOAP-ENV映射到名称空间http://schemas.xmlsoap.org/soap/envelope/,xsi映射到http://www.w3.org/1999/XMLSchema-instance,而xsd映射到http://www.w3.org/1999/XMLSchema。这三者是所有SOAP文档都拥有的标准名称空间。
最后,在Listing 4中,接口名称(即Hello)不再象在Listing 2中那样成为节点的名字;相反,它引用了一个名称空间nsl。另外,参数的类型信息也随同参数的值一起发送给了服务器。注意信封(Envelope)encodingStyle属性的值。这个属性值设置成了http://schemas.xmlsoap.org/soap/encoding/。这个值告诉服务器用来编码(即串行化)方法的编码方式;服务器需要这个信息,以便正确地解除方法的串行化。对于服务器来说,SOAP文档的自我描述能力是相当完善的。
对于上面的SOAP请求,服务器的应答如下:
Listing 5 <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-nstance" xmlns:xsd="http://www.w3.org/1999/XMLSchema"> <SOAP-ENV:Body> <ns1:sayHelloToResponse xmlns:ns1="Hello" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <return xsi:type="xsd:string">Hello John, How are you doing?</return> </ns1:sayHelloToResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope> |
Listing 5与Listing 4的请求消息类似。在上面的代码中,返回值(即个性化的“Hello”消息)包含在Body区。SOAP消息文档的格式非常灵活。例如,编码方式不固定,而是由客户程序指定。只要是客户程序和服务器都认可的编码方式,可以是任何合法的XML文档。
另外,分离调用环境信息意味着方法本身并不关心这类信息。在当前的市场上,主流应用服务器都遵从这一理念。早先,我曾经指出环境信息可以包含事务和安全方面的信息。事实上,环境可以涵盖几乎所有的东西。下面是一个SOAP消息头的例子,它带有一些事务方面的信息:
Listing 6 <SOAP-ENV:Header> <t:Transaction xmlns:t="some-URI" SOAP-ENV:mustUnderstand="1"> 5 </t:Transaction> </SOAP-ENV:Header> |
名称空间t映射到了与特定应用有关的URI。这里的5表示的是该方法从属于其中的事务ID。注意SOAP信封mustUnderstand属性的应用。这个属性被设置成了1,它表示服务器要么理解并按照要求处理该事务请求,要么表示无法处理该请求;这是SOAP规范所要求的。
二、错误处理
使用SOAP并不意味着任何时候所有的请求都会获得成功。许多地方可能会出现差错。例如,服务器可能无法访问某个关键性的资源(比如数据库),因而无法顺利地处理请求。
让我们返回“Hello”实例,为它加上一个假想的约束,即“在星期二向别人说Hello不合法。”因此,星期二的时候,即使发送给服务器的请求是合法的,服务器也会把一个错误信息返回给客户端。应答内容将如下所示:
Listing 7 <SOAP-ENV:Envelope xmlns:SOAP-ENV=" http://schemas.xmlsoap.org/soap/envelope/"> <SOAP-ENV:Body> <SOAP-ENV:Fault> <faultcode>SOAP-ENV:Server</faultcode> <faultstring>Server Error</faultstring> <detail> <e:myfaultdetails xmlns:e="Hello"> <message> Sorry, my silly constraint says that I cannot say hello on Tuesday. </message> <errorcode> 1001 </errorcode> </e:myfaultdetails> </detail> </SOAP-ENV:Fault> </SOAP-ENV:Body> </SOAP-ENV:Envelope> |
我们来分析一下http://schemas.xmlsoap.org/soap/envelope/名称空间定义的Fault元素。Fault元素总是Body元素的直接子元素,所有的SOAP服务器必须始终通过该元素报告所有错误情况。Fault元素必须包含faultcode和faultstring元素,不能有例外。faultcode是一个能够标识问题的代码;客户程序按照SOAP规范的要求利用faultcode进行算法处理。SOAP规范定义了一小组错误代码供用户使用。另一方面,faultstring是供人类阅读的错误信息。
Listing 7的代码还包含了一个detail元素。由于错误在处理SOAP消息的Body区时出现,detail元素必须出现。正如你将在本文后面看到的,如果错误在处理Header区时出现,detail元素不应出现。在Listing 7中,应用利用detail元素提供当前错误更详细、更自然的解释,即星期二不允许说Hello。SOAP还提供另外一个面向具体应用的错误代码,即半可选的faultfactor元素,但上面的错误信息中没有显示这个元素。之所以称这个元素是半可选的,是因为如果错误消息不是由请求最终处理点的服务器发送,即由一个中间服务器发送,则错误消息必须包含该元素。SOAP对faultcode元素不应出现的情形没有作任何规定。
在Listing 7中,错误起源于方法调用本身,处理该方法的应用导致了这个错误。现在,我们来看一下另一种类型的错误,这种错误由于服务器不能处理请求头信息而导致。举例来说,假设所有的Hello消息必须在一个事务环境之内生成,则请求类似于:
Listing 8
<SOAP-ENV:Envelope |
上面消息的Header区包含一个transaction元素,它指定了方法调用必须从属于其中的事务编号。这里我说“必须”是因为transaction元素使用了mustUnderstand属性。如前所述,SOAP服务器要么遵照属性的指示处理请求,要么声明不能处理请求。假定SOAP服务器不能处理,它必须返回一个错误信息。这时的应答应该类似于:
Listing 9
<SOAP-ENV:Envelope xmlns:SOAP-ENV=" |
上面的代码类似Listing 7显示的错误信息。但应该注意的是,detail元素不再出现。正如我在前面指出的:SOAP规范规定,如果错误在处理Header区的时候出现,则错误消息中不应包含detail元素。事实上,我们可以根据detail元素是否出现,迅速判定错误是在处理Body区还是在处理Header区时出现。
三、SOAP与HTTP
在第一个例子中,我通过HTTP把定制的XML请求发送给服务器,但没有详细介绍这么做涉及到了哪些操作。现在我们回过头来看那个问题。怎样才能把一个SOAP请求(而不是定制的XML)通过HTTP发送给服务器?SOAP很自然地遵循了HTTP的请求/应答消息模型。这个模型在HTTP请求中提供SOAP请求参数,在HTTP应答中提供SOAP应答参数。实际上,SOAP 1.0特别指明HTTP作为它的传输协议。SOAP 1.1略有放松。虽然SOAP 1.1仍旧可以使用HTTP,但它也可以使用其他协议,比如SMTP。在这个系列的文章中,我只讨论通过HTTP使用SOAP的情形。
让我们返回Hello示例。如果我们通过HTTP把SOAP请求发送给服务器,则代码应该类似于:
Listing 10
POST http://www.SmartHello.com/HelloApplication HTTP/1.0
|
Listing 10代表的SOAP请求与Listing 4的请求基本相同,但Listing 10的开头加入了一些HTTP特有的代码。第一行代码表明这是一个遵循HTTP 1.1规范的POST请求,POST的目标是http://www.SmartHello.com/HelloApplication。下一行指示内容的类型,在HTTP消息中包含SOAP实体时,内容类型必须是text/xml。Content-Length指明了POST请求有效载荷的长度。
第四行是SOAP特有的,而且它是必不可少的。SOAPAction HTTP请求头指明了SOAP HTTP请求的目标,它的值是一个标识目标的URI。SOAP不对该URI的格式作任何限制,实际上,这个URI甚至不必对应某个实际的位置。
SOAPAction的一个可能的应用是,防火墙检查该请求头的值,决定是否允许请求通过防火墙。
一旦服务器处理完请求,它将向客户返回一个应答。应答的内容如Listing 11所示(假设没有出现错误):
Listing 11
HTTP/1.0 200 OK
|
这个SOAP应答与Listing 5所显示的一样,但前面加上了一些HTTP特有的代码。由于没有出现错误,第一行代码显示应答状态是200。在HTTP协议中,200应答状态代码表示“一切正常”。如果在处理SOAP消息(Header区或者Body区)的时候出现了任何错误,则返回的状态代码将是500。在HTTP中,500状态代码表示“internal server error”。此时,上述SOAP应答的第一行代码将是:
HTTP 500 Internal Server Error |
四、HTTP扩充框架
许多应用对服务的需求超过了传统HTTP提供的服务。其结果就是,这类应用扩充了传统的HTTP协议。然而,这种扩充是应用本身私有的。HTTP扩充框架试图确立一个通用的HTTP扩充机制,从而解决这个问题。HTTP扩充框架的扩充之一是增加了一个M-POST方法,其中的M表示Mandatory(必须遵循的,强制的)。如果一个HTTP请求包含至少一个强制的扩充声明,那么这个请求就称为强制的请求。引入强制的扩充声明通过Man或者C-Man头进行。强制请求的请求方法名字必须带有“M-”前缀,例如,强制的POST方法称为M-POST。
SOAP 1.0要求客户程序首先发送一个HTTP POST请求,只有当服务器返回错误510时才发送M-POST请求。SOAP 1.1不再对客户作这种限制,也就是说,SOAP 1.1允许客户从发送任何一种类型的请求开始。下面的请求就是迄今为止我们一直在讨论的那个请求,但它现在是M-POST格式:
Listing 12
M-POST http://www.SmartHello.com/HelloApplication HTTP/1.1 |
对于实际的SOAP消息来说,Listing 12和Listing 10没有什么不同。但请求头中有一些不同的地方,例如,现在我们发出的不是POST请求,而是一个M-POST请求。正如前面所介绍的,象M-POST这样的强制请求至少有一个强制扩充声明。这里我们就有一个:Man域描述了一个强制性的端到端扩充声明,把头前缀01映射到了名称空间http://schemas.xmlsoap.org/soap/envelope/。请注意这个前缀关联到SOAPAction域的方式。
一旦服务器处理完该请求,它将返回一个应答给客户。应答内容类如(假设没有出现错误):
Listing 13
HTTP/1.0 200 OK |
同样地,Listing 13显示的应答类似于对普通POST请求的应答(如Listing 11所示),两者的不同之处在于Ext域。
在通过HTTP使用SOAP的过程中,我们欣喜地看到,实际的SOAP消息(SOAP信封和它里面的所有内容)总是保持不变,就如消息尚未加载HTTP协议时一样。根据这一事实可以推断出,HTTP不是能够与SOAP协作的唯一协议。例如,SOAP可以方便地和SMTP协议或者其他定制的私有协议一起运行。唯一的要求是两者——客户端和服务器端——都理解该协议。
发表评论
-
Java 调用PHP的Web Service
2012-07-17 15:01 7108usoap是PHP环境中的开 ... -
Web Service 介绍
2012-07-16 11:21 823webservice的原理及概念 ... -
REST总结之二
2012-06-07 12:29 802由于有个合作项目,用到了REST,我们这边的服务器是j ... -
REST总结
2012-06-07 12:20 851一、概念及特点 ... -
Filter vs Servlet
2012-05-29 14:48 0Filter介绍 Filter可认为是Servlet的一 ... -
事务隔离性与传播性概述
2012-05-29 14:30 1079什么是事务? 从四个关键概念谈起: 原子性 – 所有操作要么都 ... -
JDBC vs JNDI
2012-05-29 14:08 904JDBC:jdbc是数据库中间代理商为了是java连接数据 ... -
WebSphere下用JNDI
2011-05-05 16:38 1076自己遇到过的问题,贴出来让和我遇到同样问题的人参考一下 远程 ... -
什么是J2EE?
2010-09-11 17:36 807J2EE平台由一整套服务(Services)、应用程序接口(A ...
相关推荐
本文档将详细介绍SOAP 1.2的基本概念、组成部分及其在不同协议下的绑定。 SOAP 1.2由四个核心部分构成: 1. **信封(Envelope)**:信封定义了消息的结构,包括头部(Header)和主体(Body)。头部通常包含处理消息所需...
SOAP,全称为Simple Object Access Protocol,即简单对象访问协议,是一种在分布式环境中交换信息的简洁协议。它利用XML(Extensible Markup Language)作为消息格式,使得不同平台和应用程序之间的数据交换变得更加...
而`laravel-soap`是Laravel的一个扩展包,专门用于处理SOAP(Simple Object Access Protocol)协议,这是一...通过理解SOAP协议的基本概念和`laravel-soap`的使用方式,开发者可以更好地实现跨系统通信和集成外部服务。
SOAP(Simple Object Access Protocol)是一种基于XML的协议,用于在Web服务中交换结构化和类型化...此外,了解SOAP对于理解其他基于XML的通信协议,如RESTful API,也有一定的帮助,因为它们共享一些基础概念和机制。
### SOAP 的概念以及简单应用 #### 一、什么是 SOAP? SOAP(Simple Object Access Protocol),即简单对象访问协议,是一种在分布式环境中交换信息的简单协议。它基于 XML,并且旨在简化跨平台的应用程序间的通信...
在本文中,我们将深入探讨SOAP协议的核心概念、结构以及其在实际应用中的作用。 1. **SOAP消息结构:** SOAP消息以XML文档的形式发送,遵循一定的结构规则。一个基本的SOAP消息包括三部分: - **Envelope(信封)...
WebService和SOAP(Simple Object Access Protocol)是两个关键的IT概念,它们在分布式系统和企业级应用程序集成中扮演着重要角色。本篇文章将深入探讨这两个主题,并介绍如何使用SOAP抓取工具来分析和理解...
标题中的“SoapToolkit...在使用Soap Toolkit 3.0时,开发者应确保了解SOAP的基本概念,熟悉XML语法,以及掌握VBA编程的基础知识。同时,安装并正确配置这个工具,可以显著提升在VB环境中进行Web服务开发的效率和质量。
Java SOAP(Simple Object Access Protocol)学习资料主要涵盖了如何使用Java进行SOAP Web服务的开发、调用和交互。SOAP是一种基于XML的协议,用于在Web上交换结构化和类型化的信息。以下是一些重要的知识点: 1. *...
这个“soap简单入门程序”是一个基础的学习资源,旨在帮助初学者理解SOAP协议的基本概念和工作原理。 首先,我们需要了解SOAP的核心组成部分。SOAP消息通常包含三部分:Header、Body和Envelope。Header用来传递元...
综上所述,SOAP白皮书不仅详细阐述了SOAP的核心概念和技术细节,还提供了丰富的示例和最佳实践,对于初学者和专业开发者来说,都是学习和理解SOAP不可或缺的资源。无论是构建Web服务还是实现跨平台通信,掌握SOAP的...
总的来说,这个压缩包可能包含SOAP基本概念的介绍、ASIS2的详细规范、SOAP消息解析示例代码、WSDL的编写指导,以及可能的调试和测试工具的使用教程。通过学习这些内容,你可以深入理解SOAP协议,掌握如何创建、解析...
虽然这涉及到一些XML和网络编程的概念,但QtSoap库简化了这个过程,使Qt开发者能够轻松地集成Web Service功能到他们的应用程序中。通过熟练掌握这些技术,开发者可以构建出强大且可扩展的跨平台应用。
在本文中,我们将深入探讨SOAP协议的核心概念、工作原理以及与之相关的库包。 一、SOAP协议概述 1. **基本概念**:SOAP是一种轻量级的消息传递协议,它定义了消息的格式和如何通过HTTP、SMTP等传输协议进行交换。...
描述中的“关于soap的文档”表明内容可能包括SOAP的基本概念、工作原理、如何使用SOAP进行Web服务调用,以及SOAP消息的结构和格式等相关知识。 基于标签"soa soap_java java_soap soap",我们可以推测文件可能涵盖...
对于初学者,首先需要理解SOAP的基础概念,包括SOAP消息的结构(Envelope、Header和Body)、SOAP协议的工作流程以及XML在其中的作用。然后,通过阅读"www.pudn.com.txt"文件,可能包含的是关于这些示例的详细说明或...
本文旨在为初学者提供一个全面的SOAP入门指南,涵盖其基础概念、消息结构、以及如何使用Java API进行消息的创建与处理。 #### 二、创建并发送简单消息 在开始之前,我们先了解如何使用SAAJ(SOAP with Attachments...
#### 四、SOAP的关键概念 1. **SOAP消息元素:** - **必须**包含的元素包括`<SOAP-ENV:Envelope>`,其中`<SOAP-ENV:Header>`和`<SOAP-ENV:Body>`为子元素。 - `<SOAP-ENV:Header>`可以包含元数据,如认证信息或...
【SOAP协议详解与iOS POST请求实现】 SOAP(Simple Object Access Protocol),简单对象访问协议,是一种轻量级的、基于XML的协议,用于在Web服务中...理解这些概念和实践方法对于开发与Web服务集成的应用至关重要。