SOAPQSimple Object Access ProtocolQ,它是一U标准消息传递协议,通常是Web Service的事实标准。SOAP是以XML为基QSOAP消息格式是由XML Schema模式定义Q通过XML命名I间使SOAPh很强的扩展性?br /> SOAP messageQSOAP XML文实例Q通常通过其他某些|络协议的有效蝲h携带SOAP消息Q例如:HTTP, SMTP, TCP/IP{?br /> WebService可以使用两种消息传递方式:One-Way messagingQ单向消息传递)或者Request/Response messagingQ请?响应消息传递)
二、SOAP的基本结?br />
SOAP中根元素是Envelope元素。Envelope元素中可以包含多个可选的Header元素Q必d时包含一个Body元素。Header元素必须是Envelope元素的直接子元素Qƈ且要位于Body元素之前?br />
三、SOAP的命名空?br />
SOAP消息可以在Header元素和Body元素中包含若q不同的XML元素Q用唯一的命名空间来标识它们?br />
xmlns:soap=http://schemas.xmlsoap.org/soap/envelope/命名I间定义了标准SOAP元素Q例如:Envelope, Header和Body{)。Header元素的每个头文g都有自己的命名空间?br />
四?SOAP?br />
SOAP header在Web Service中的应用来多Q例如安全性、事务以及其他各U服务方面的大量“标准”文g头。SOAP文g头是扩展SOAP协议的一个功能非常强大的措施QSOAP文g头的扩展性是SOAP得以行q且获得其他协议没有取得成功的另一个原因?br />
4.1 actor属?next、ultimate receiver)
Actor是由SOAP注释定义的,在SOAP 1.2中,actor属性已l被更名为role。Actor属性和XML命名I间l合在一起用,以确定要用哪个代码模块处理具体的Header?br />
Next角色表示消息路径中的下一个节点必d理文件头?br />
Ultimate receiver角色表示只有消息的最l接收方才能处理指定的Header?br />
4.2 mustUnderstand属?br />
表示处理是否为强制性处理,如果一个节点不能识别某一个强制性HeaderQ那么必定会产生SOAP错误?br />
如果MustUnderstand属性的值是0Q如果应用程序没有能够识别该文g_那么必须删除此文件头?br />
五、SOAP?br />
Body元素要包含应用程序专有的数据或者错误消息。应用程序的专有数据可以是Q意XML数据或者是提供l过E调用的L参数。只有SOAP消息最后的接收方应该处理SOAP Body?br />
六、SOAP消息传递模?br />
SOAP支持四种消息传递模式(RPC/Literal, Document/ Literal, RPC/Encoded, and Document/EncodedQ,但是WS-I Basic Profile只允许RPC/Literal和Document/ LiteralQ不支持SOAP encodingQ因为它会引起严重的互操作性。Literal表示可以ҎXML模式验证XML文档的有效性?br />
6.1 Document/ Literal消息传递模?br />
Document/ Literal消息传递模式中QSOAP的Body元素包含一个XML格式良好的文段Q?br />
6.2 RPC/Literal消息传递模?br />
RPC/Literal消息传递模式将Body元素格式化成struct。PRCh消息包含调用的方法名UC输入参数。RPC响应消息则包含返回值和各种输出参数Q或者错误)Q?/p>
6.3 消息传递模式和消息交换模式
Messaging ModesQ(RPC/Literal, Document/ Literal, RPC/Encoded, and Document/EncodedQ。消息传递模式通常描述的是SOAP消息的有效负载:即XML文档D|者是q程q程调用对应的参数和q回值的XML表示?br />
Messaging Exchange Patterns (MEPs)QOne-Way and Request/Response MEPs。消息交换模式表C的是消息的向Q而不是消息的内容
七、SOAP错误
SOAP错误是由消息接收方(消息的中介体或者最l接收方Q生的。只有用的h/响应消息传递模式的时候,才要L收方SOAP错误传递给发送方?br />
7.1 faultcode元素
faultcode表示错误错误代码Q包括Client、Server、VersionMismatch和MustUnderstand不同cd?br />
Client表示传递SOAP消息的节点出C错误Q发送错误)Q例如:消息不是一个良好的格式Q或者包含无效数据、缺所期望的信息,接收节点׃产生一个Client错误?br />
Server表示接收到SOAP消息的节点发生故障或者不能处理SOAP消息Q中介体或者最l接收方引v的错误)。例如:当接收节点处理SOAP消息不能q接到数据库{资源,׃产生一个Server错误?br />
VersionMismatch表示接收节点不能识别SOAP消息的Envelope元素的命名空_例如QSOAP 1.1的节Ҏ收到SOAP1.2消息?br />
MustUnderstand表示节点不能识别“MustUnderstand=1”指定的headerQ就会生这个类型的fault?br />
q有一些非标准的错误信息例如:
7.2 faultstring元素
faultstring表示错误的描qͼ是强制性元素,可以使用Ҏ属性xml:lang表示文本消息使用的语a?br />
7.3 faultactor元素
faultactor表示遇到错误q且产生错误的节点,如果错误节点是一个中介节点,那么需要用faultactor元素Q但是如果错误节Ҏ最l接收方Q则该元素可选?br />
7.4 detail元素
如果Body元素的内容生错误,必须包含错误消息的detail元素Q但是如果文件头发生错误Q则不能包含该元?br />
八、SOAP和HTTP
目前最常用SOAP的传输体是HTTP。大多数HTTP的传输由HTTP GETh和HTTP应答l成的,HTTP GETh指定了请求的面Q可以包含一些参敎ͼHTTP response作ؓ有效负蝲q回到到h斏V另外,HTTP POSTh有效负蝲Q所以适合携带SOAP消息?br />
8.1 HTTP POST消息传输的SOAP
HTTP POST消息必须包含SOAPAction文g字头QSOAP1.2?“application/soap+xml”) MIMEcd替换SOAPAction文g头?br />
Content-Type是text/xmlQ表C有效负载是一个XML文。带附g的SOAP会指定mulitpart/relatedQ但是不推荐q样做?br />
8.2 HTTP响应代码
200-level的HTTP成功代码包括Q?br />
200 OK表示消息没有错误Q包含一个正常的SOAP响应消息?br />
200 AcceptedQ表C成功处理了hQ但是没有SOAP响应数据Q类gvoidq回cd?br />
400-level错误
400 Bad RequestQ表CSOAP消息中的HTTPh或者XML格式不正?br />
405 Method Not AllowedQ如果不是通过HTTP POST方式传递的SOAP消息Q返回此错误?br />
415 Unsupported Media TypeQtext/xml值包含一个Content-Type文g_否则返回此错误?br />
500 Internal Server ErrorQ当h/响应MEP中的响应消息是SOAP错误Ӟ必须使用此代码?/p>
1、徏立一个Remote Interface
2、Service Implementation
官网上的例子是没有实现MathService接口的,而且也能q行成功Q但我觉得有点不合逻辑Q不应该该实现cM为MathService接口暴露lclient端?/p>
3、web.xml
4、Java client
使用java实现的clientQ通过HessianProxyFactory的create卛_获取到服务接口?/p>
5、python client
使用python实现的clientQ需加入hessianlib.py?/p>
以上是一个完整的Hessian实现?/p>
Spring也提供了对Hessian的集成,若用springQserver端的service实现cd不需实现HessianServletQ用Spring的DispatcherServlet来配|一个Servlet暴露你的服务?br />
web.xml
q需要在 WEB-INF 目录里创Z个名?remote-servlet.xmlQremoteZ配置的servlet名)的应用上下文?br />
remote-servlet.xml
server端做以上操作卛_?/p>
client端可以g用之前的操作Q若使用spring则可通过 HessianProxyFactoryBean在客Lq接服务Q在spring的配|中加入Q?/p>
加入以上的配|后Q就可像使用其他的bean一样去操作了。原来实C个webservice是可以这么简单的?/p>