Soap技术总结

来源:互联网 发布:优酷录视频软件 编辑:程序博客网 时间:2024/05/29 09:12

Soap技术总结

Soap是什么?

SOAP Simple Object Access Protocol(简单对象访问协议)的缩写。

SOAP是一个用于分布式环境的、轻量级的、基于XML进行信息交换的通信协议.

对于Soap的理解:

第一步理解:SOAPHTTPXML

第二步理解:SOAPXML的使用代码化为请求和响应参数编码模式,并用HTTP作传输。

SOAP是把成熟的基于HTTPWEB技术与XML的灵活性和可扩展性组合在了一起。

第三步理解:具体地讲,一个SOAP实现可以简单地看作遵循SOAP编码规则的HTTP请求和响应。

注意:SOAP 是一个协议,与编程语言无关。实际上,许多语言已经开始支持 SOAP,如:JavaCC++以及JavaScript

Soap的起源?Soap解决的问题?

SOAP最初由微软发起研究,用以解决MTS/COM资源消耗大,不够轻巧等问题,后逐渐被IBM等巨头接纳并加入研究,现已提交W3C,成为Web Service应用传输标准。SOAP技术主要用于实现大量异构程序和平台之间的互操作性,从而使存在的应用能够被广泛的用户所访问。

SOAP意思是简单对象访问协议(Simple Object Access Protocol)。的确如它的名字一样,SOAP是很简单的。它是一个基于XML的协议,允许程序组件和应用程序彼此使用一种标准的Internet协议--HTTP来通讯。SOAP是一种独立的平台,它不依赖程序语言,它是简单的,弹性的,很容易扩展的。目前,应用程序能够彼此使用一种基于DCOMCORBA技术的远程过程调用(RPC)来进行相互通讯,但HTTP不被设计为这个目的。RPCInternet上应用是非常困难的,它们会出现许多兼容性和安全性的问题,因为防火墙和代理服务器通常都会阻断(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-ENVEnvelope),一

个可选的SOAP(SOAP-ENVHead)和一个必需的SOAP(SOAP-ENVBody)

 

一个简单的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>

 

SoapRpc表示(与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>

 Soap如何实现与Http协议的绑定?

服务器怎样解释这个请求-URI是与实现相关的,但是许多实现中可能用它来映射到一个类或者一个对象。

一个SOAP请求也必须用SOAPMethodName  HTTP头来指明将被调用的方法。简单地讲,SOAPMethodName头是被URI指定范围的应用相关的方法名,它是用#符作为分隔符将方法名与URI分割开: 

SOAPMethodName:  urn:strings-com:IString#reverse 

这个头表明方法名是reverse,范围URIurn: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服务的实现。

CApache Soap更近一步的知识可以参考Apache SoapApi,以及Axis的相关内容