笨鸟先飞|网络学院:教程,资料,技巧,应用.

www.itfly.org

您正在浏览: 主页>网络基础>HTTP协议>
  文章搜索

  热点文章

Http指纹识别技术

HTTP协议四--关于Chunked编码

浅谈HTTP协议(一)--结构

浅谈HTTP协议(二)--返回值

利用HTTP协议的特性进行拒绝服务

HTTP和WWW的配置注意事项

协议分析的优势—HTTP分析器检测

WWW的核心——HTTP协议

SOAP 1.1规范

HTTP协议三--断点续传

SOAP 1.1规范

来源:    作者:    时间:1970-01-01    字体:[ ]

SOAP简介

SOAP(SimpleObjectAccessProtocal,简单对象访问协议)技术有助于实现大量异构程序和平台之间的互操作性,从而使存在的应用能够被广泛的用户所访问。SOAP是把成熟的基于HTTP的WEB技术与XML的灵活性和可扩展性组合在了一起。

SOAP的一个主要目标是使存在的应用能被更广泛的用户所使用。为了实现这个目的,没有任何SOAPAPI或SOAP对象请求代理(SOAPORB),SOAP是假设你将使用尽可能多的存在的技术。几个主要的CORBA厂商已经承诺在他们的ORB产品中支持SOAP协议。微软也承诺在将来的COM版本中支持SOAP。DevelopMentor已经开发了参考实现,它使得在任何平台上的任何Java或Perl程序员都可以使用SOAP。而且IBM和Sun也陆续支持了SOAP协议,和MS合作共同开发SOAP规范和应用。目前SOAP已经成为了W3C和IETF的参考标准之一。

SOAP的指导理念是“它是第一个没有发明任何新技术的技术”。它采用了已经广泛使用的两个协议:HTTP和XML。HTTP用于实现SOAP的RPC风格的传输,而XML是它的编码模式。采用几行代码和一个XML解析器,HTTP服务器(如MS的IIS或Apache)立刻成为了SOAP的ORBs。因为目前超过一半的Web服务器采用IIS或Apache,SOAP将会从这两个产品的广泛而可靠的使用中获取利益。这并不意味着所有的SOAP请求必须通过Web服务器来路由,传统的Web服务器只是分派SOAP请求的一种方式。因此Web服务如IIS或Apache对建立SOAP性能的应用是充分的,但决不是必要的。

SOAP把XML的使用代码化为请求和响应参数编码模式,并用HTTP作传输。这似乎有点抽象。具体地讲,一个SOAP方法可以简单地看作遵循SOAP编码规则的HTTP请求和响应。一个SOAP终端则可以看作一个基于HTTP的URL,它用来识别方法调用的目标。象CORBA/IIOP一样,SOAP不需要具体的对象被绑定到一个给定的终端,而是由具体实现程序来决定怎样把对象终端标识符映射到服务器端的对象。

SOAP请求是一个HTTPPOST请求。SOAP请求的content-type必须用text/xml。而且它必须包含一个请求-URI。服务器怎样解释这个请求-URI是与实现相关的,但是许多实现中可能用它来映射到一个类或者一个对象。一个SOAP请求也必须用SOAPMethodNameHTTP头来指明将被调用的方法。简单地讲,SOAPMethodName头是被URI指定范围的应用相关的方法名,它是用#符作为分隔符将方法名与URI分割开:

SOAPMethodName:urn:strings-com:IString#reverse

这个头表明方法名是reverse,范围URI是urn:strings-com:Istring。在SOAP中,规定方法名范围的名域URI在功能上等同于在DCOM或IIOP中规定方法名范围的接口ID。

简单的说,一个SOAP请求的HTTP体是一个XML文档,它包含方法中[in]和[in,out]参数的值。这些值被编码成为一个显著的调用元素的子元素,这个调用元素具有SOAPMethodNameHTTP头的方法名和名域URI。调用元素必须出现在标准的SOAP<Envelope>和<Body>元素内(后面会更多讨论这两个元素)。下面是一个最简单的SOAP方法请求:

POST/string_server/Object17HTTP/1.1
Host:209.110.197.2
Content-Type:text/xml
Content-Length:152
SOAPMethodName:urn:strings-com:IString#reverse
<Envelope>
<Body>
<m:reversexmlns:m=''urn:strings-com:IString''>
<theString>Hello,World</theString>
</m:reverse>
</Body>
</Envelope>
SOAPMethodName头必须与<Body>下的第一个子元素相匹配,否则调用将被拒绝。这允许防火墙管理员在不解析XML的情况下有效地过滤对一个具体方法的调用。

SOAP响应的格式类似于请求格式。响应体包含方法的[out]和[in,out]参数,这个方法被编码为一个显著的响应元素的子元素。这个元素的名字与请求的调用元素的名字相同,但以Response后缀来连接。下面是对前面的SOAP请求的SOAP响应:

200OKContent-Type:text/xml
Content-Length:162
<Envelope>
<Body>
<m:reverseResponsexmlns:m=''urn:strings-com:IString''>
<result>dlroW,olleH</result>
</m:reverseResponse>
</Body>
</Envelope>
这里响应元素被命名为reverseResponse,它是方法名紧跟Response后缀。要注意的是这里是没有SOAPMethodNameHTTP头的。这个头只在请求消息中需要,在响应消息中并不需要。

第二节SOAP体的核心

SOAP的XML特性是为把数据类型的实例序列化成XML的编码模式。为了达到这个目的,SOAP不要求使用传统的RPC风格的代理。而是一个SOAP方法调用包含至少两个数据类型:请求和响应。考虑这下面个COMIDL代码:


[uuid(DEADF00D-BEAD-BEAD-BEAD-BAABAABAABAA)]
interfaceIBank:IUnknown{
HRESULTwithdraw([in]longaccount,
[out]float*newBalance,
[in,out]float*amount
[out,retval]VARIANT_BOOL*overdrawn);
}
在任何RPC协议下,account和amount参数的值将出现在请求消息中,newBalance、overdrawn参数的值,还有amount参数的更新值将出现在响应消息中。

SOAP把方法请求和方法响应提升到了一流状态。在SOAP中,请求和响应实际上类型的实例。为了理解一个方法比如IBank::withdraw怎样映射一个SOAP请求和响应类型,考虑下列的数据类型:

structwithdraw{
longaccount;
floatamount;
};

这时所有的请求参数被打包成为单一的结构类型。同样下面的数据表示打包所有响应参数到单一的数据类型。

structwithdrawResponse{
floatnewBalance;
floatamount;
VARIANT_BOOLoverdrawn;
};
再给出下面的简单的VisualBasic程序,它使用了以前定义的Ibank接口:

DimbankasIBank
DimamountasSingle
DimnewBalasSingle
DimoverdrawnasBoolean
amount=100
Setbank=GetObject("soap:http://bofsoap.com/am")
overdrawn=bank.withdraw(3512,amount,newBal)

上一页12 3 4 下一页 www.itfly.org