Soap是什么?
SOAP 是Simple Object Access Protocol(简单对象访问协议)的缩写。
SOAP是一个用于分布式环境的、轻量级的、基于XML进行信息交换的通信协议.
对于Soap的理解:
第一步理解:SOAP=HTTP+XML
第二步理解:SOAP把XML的使用代码化为请求和响应参数编码模式,并用HTTP作传输。
SOAP是把成熟的基于HTTP的WEB技术与XML的灵活性和可扩展性组合在了一起。
第三步理解:具体地讲,一个SOAP实现可以简单地看作遵循SOAP编码规则的HTTP请求和响应。
注意:SOAP 是一个协议,与编程语言无关。实际上,许多语言已经开始支持 SOAP,如:Java,C,C++以及JavaScript。
Soap的起源?Soap解决的问题?
SOAP最初由微软发起研究,用以解决MTS/COM资源消耗大,不够轻巧等问题,后逐渐被IBM等巨头接纳并加入研究,现已提交W3C,成为Web Service应用传输标准。SOAP技术主要用于实现大量异构程序和平台之间的互操作性,从而使存在的应用能够被广泛的用户所访问。
SOAP意思是简单对象访问协议(Simple Object Access Protocol)。的确如它的名字一样,SOAP是很简单的。它是一个基于XML的协议,允许程序组件和应用程序彼此使用一种标准的Internet协议--HTTP来通讯。SOAP是一种独立的平台,它不依赖程序语言,它是简单的,弹性的,很容易扩展的。目前,应用程序能够彼此使用一种基于DCOM和CORBA技术的远程过程调用(RPC)来进行相互通讯,但HTTP不被设计为这个目的。RPC在Internet上应用是非常困难的,它们会出现许多兼容性和安全性的问题,因为防火墙和代理服务器通常都会阻断(block)这些类型的流量。应用程序之间最好的通讯方式是通过HTTP协议,因为HTTP是支持所有Internet浏览器和服务器的。基于这个目的,SOAP协议被创建出来。
Soap的主要构成是怎么样的?
Soap的设计目标是:简单性 和 兼容性 。
SOAP协议构成方式,包括四个部分:
SOAP封装(envelop):SOAP信封规范对计算机间传递的数据如何封装定义了具体的规则。这包括应用特定的数据,如要调用的方法名,方法参数和返回值;还包括谁将处理封装内容,失败时如何编码错误消息等信息。
SOAP编码规则(encoding rules):为了交换数据,计算机必须在编码特定数据类型的规则上达成一致,SOAP也有自己的一套编码数据类型的约定。大部分约定都基于W3C XML Schema规范 。
SOAP RPC表示(RPC representation):SOAP为双向消息接发定义了一个简单的协定来进行远程过程调用和响应,这使得客户端应用可以指定远程方法名,获取任意多个参数并接受来自服务器的响应。
SOAP绑定(binding):提供了更底层协议传输SOAP封套的一套通用机制。
下面我们要重点关注的内容是:
1>.soap协议的封装:
2>.soap协议的Rpc表示。(具体与Http协议绑定实现)
Soap的封装方式
SOAP消息是一个XML文档,包括一个必需的SOAP封装(SOAP-ENV:Envelope),一
个可选的SOAP头(SOAP-ENV:Head)和一个必需的SOAP体(SOAP-ENV:Body)。
一个简单的Soap封装的例子
A.XML文件
<?xml version="1.0" encoding='UTF-8' ?>
<Hello>
<sayHelloTo>
<name>John</name>
</sayHelloTo>
</Hello>
B. Soap封装后的XML文件
<?xml version='1.0' encoding='UTF-8'?> §XML声明
<SOAP-ENV:Envelope
xmlns:SOAP-ENV=http://schemas.xmlsoap.org/soap/envelope/
§解析:名字空间声明,防止多个XML文件组合时发生标签名字的冲突
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
§解析:声明了XML模式实例的名字空间
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
§解析:另外一个名字空间声明,它定义了XML Schema名字空间,这个名字空间下
的元素用来指定xsi:type 属性的值(如xsd:string)
<SOAP-ENV:Header>
</SOAP-ENV:Header>
§解析:简单的存放一些指令,提供给接收消息的SOAP处理器。可选项在这里可以去除掉
<SOAP-ENV:Body>
§解析:SOAP主体用来存放实际数据或消息的有效负载,从而提供给最终的接受者使用或处理。
<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的Rpc表示(与Http协议绑定)
C. Soap协议绑定Http协议生成的请求
POST http://www.SmartHello.com/HelloApplication HTTP/1.1
§解析:代码表明这是一个遵循HTTP 1.1规范的POST请求,POST的目标是http://www.SmartHello.com/HelloApplication
Content-Type: text/xml; charset="utf-8"
§解析:在HTTP消息中包含SOAP实体时,内容类型必须是text/xml
Content-Length: 587
§解析:指明了POST请求有效载荷的长度
SOAPAction: "http://www.SmartHello.com/HelloApplication#sayHelloTo"
<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>
D.Soap协议绑定Http协议生成的响应
l 生成正确的信息
HTTP/1.0 200 OK
§解析:在HTTP协议中,200应答状态代码表示“一切正常”。如果在处理SOAP消息(Header区或者Body区)的时候出现了任何错误,则返回的状态代码将是500。在HTTP中,500状态代码表示“internal server error”。此时,上述SOAP应答的第一行代码将是:HTTP 500 Internal Server Error
Content-Type: text/xml; charset="utf-8"
Content-Length: 615
<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: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>
l 生成出错的信息 (处理必要的头出错)
HTTP/1.1 500 Internal Server Error
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
§解析:fault表示相应的错误元素
<faultcode>SOAP-ENV:MustUnderstand</faultcode>
§解析:faultcode元素给软件提供了一个识别此错误的算法机制。SOAP定义一些SOAP faultcode描述基本的SOAP错误
<faultstring>SOAP Must Understand Error</faultstring>
§解析:SOAP错误元素必须有faultstring子元素,并且它应该提供一些错误本质的解释信息。
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
l 生成出错的信息 (处理处理Body出错)
HTTP/1.1 500 Internal Server Error
Content-Type: text/xml; charset="utf-8"
Content-Length: nnnn
<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>
§解析:detail元素用来携带与Body元素有关的应用程序所要的错误信息。如果Body元素的内容不能被成功的处理,则必须包含detail子元素。Fault元素中没有detail元素表示这个错误与Body元素的处理无关。在有错误的时候,这可以用来区分Body元素有没有被正确的处理。
<e:myfaultdetails xmlns:e="Some-URI">
<message>
My application didn't work
</message>
<errorcode>
1001
</errorcode>
</e:myfaultdetails>
</detail>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
服务器怎样解释这个请求-URI是与实现相关的,但是许多实现中可能用它来映射到一个类或者一个对象。
一个SOAP请求也必须用SOAPMethodName HTTP头来指明将被调用的方法。简单地讲,SOAPMethodName头是被URI指定范围的应用相关的方法名,它是用#符作为分隔符将方法名与URI分割开:
SOAPMethodName: urn:strings-com:IString#reverse
这个头表明方法名是reverse,范围URI是urn:strings-com:Istring。
简单的说,一个SOAP请求的HTTP体是一个XML文档,它包含方法中[in]和[in,out]参数的值。这些值被编码成为一个显著的调用元素的子元素,这个调用元素具有SOAPMethodName HTTP头的方法名和名域URI。调用元素必须出现在标准的SOAP <Envelope>和<Body>元素内(后面会更多讨论这两个元素)。
下面是一个最简单的SOAP方法请求:
POST /string_server/Object17 HTTP/1.1
Host: 209.110.197.2
Content-Type: text/xml
Content-Length: 152
SOAPMethodName: urn:strings-com:IString#reverse
§解析:SOAPMethodName头必须与<Body>下的第一个子元素相匹配,否则调用将被拒绝
<Envelope>
<Body>
<m:reverse xmlns:m=''urn:strings-com:IString''>
<theString>Hello, World</theString>
</m:reverse>
</Body>
</Envelope>
SOAP响应的格式类似于请求格式。下面是对前面的SOAP请求的SOAP响应:
200 OK
Content-Type: text/xml
Content-Length: 162
<Envelope>
<Body>
<m:reverseResponse xmlns:m=''urn:strings-com:IString''>
§解析:这个元素的名字与请求的调用元素的名字相同,但以Response后缀来连接。
<result>dlroW ,olleH</result>
</m:reverseResponse>
</Body>
</Envelope>
这里响应元素被命名为reverseResponse,它是方法名紧跟Response后缀。要注意的是这里是没有SOAPMethodName HTTP头的。这个头只在请求消息中需要,在响应消息中并不需要。
Apache Soap的编程语法
A.搭建Apache Soap工作环境
1. 下载需要的jar包
2. 配置环境变量
(配置到Apache Tomcat 运行环境,配置到系统classpath便于通过命令行编译运行Soap控制台)
3. 实现Soap运行环境
B. 部署一个简单的Apache Soap实例
通过两种方式部署Soap服务
通过具体代码看看Soap服务的实现。
C.Apache Soap更近一步的知识可以参考Apache Soap的Api,以及Axis的相关内容