WebService之通讯协议:SOAP
1. 简介
SOAP 是⼀种简单的基于 XML 的协议,它使应⽤程序通过 HTTP 来交换信息。SOAP 提供了⼀种标准的⽅法,使得运⾏在不同的操作系统并使⽤不同的技术和编程语⾔的应⽤程序可以互相进⾏通信。
SOAP封装(envelop):定义了⼀个框架,描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们;
SOAP编码规则(encoding rules):定义了⼀种序列化机制,⽤于表⽰应⽤程序需要使⽤的数据类型的实例;
SOAP RPC表⽰(RPC representation):定义了⼀个协定,⽤于表⽰远程过程调⽤和应答;
SOAP绑定(binding):定义了SOAP使⽤哪种协议交换信息。使⽤HTTP/TCP/UDP协议都可以。
2. 必要元素
⼀条 SOAP 消息就是⼀个普通的 XML ⽂档,包含下列元素:
必需的 Envelope 元素,可把此 XML ⽂档标识为⼀条 SOAP 消息
可选的 Header 元素,包含头部信息
必需的 Body 元素,包含所有的调⽤和响应信息
可选的 Fault 元素,提供有关在处理此消息所发⽣错误的信息
所有以上的元素均被声明于针对 SOAP 封装的默认命名空间中:
以及针对 SOAP 编码和数据类型的默认命名空间:
3. 语法规则
SOAP 消息必须⽤ XML 来编码
SOAP 消息必须使⽤ SOAP Envelope 命名空间
SOAP 消息必须使⽤ SOAP Encoding 命名空间
SOAP 消息不能包含 DTD 引⽤
SOAP 消息不能包含 XML 处理指令
4. 基本结构
<?xml version="1.0"?>
<Envelope
soap="/2001/12/soap-envelope"
encodingStyle="/2001/12/soap-encoding">
<Header>
</Header>
<Body>
<Fault>
</Fault>
</Body>
</Envelope>
4.1 Envelope
SOAP Envelope 是SOAP消息结构的主要容器,也是SOAP消息的根元素,它必须出现在每个SOAP消息中,⽤于把此XML⽂档标⽰为⼀条SOAP消息。
SOAP 1.1 规范:
<Envelope
soap-env="/soap/envelope/"
encodingStyle="/soap/encoding/">
</Envelope>
SOAP 1.2 规范:
<Envelope
soap="/2001/12/soap-envelope"
调用webservice服务encodingStyle="/2001/12/soap-encoding">
</Envelope>
SOAP 的 encodingStyle 属性⽤于定义在⽂档中使⽤的数据类型。此属性可出现在任何 SOAP 元素中,并会被应⽤到元素的内容及元素的所有⼦元素上。
4.2 Header
SOAP Header元素应当作为SOAP Envelope的第⼀个直接⼦元素,它必须使⽤有效的命名空间。Header还可以包含0个或多个可选的⼦元素,这些⼦元素称为Header项,所有的Header项都必须是完整修饰的,即必须由⼀个命名空间URI和局部名组成,不允许没有命名空间修饰的Header项存在。
Header元素⽤于与消息⼀起传输附加消息,如⾝份验证或事务信息。Header元素也可以包含某些属性。SOAP在默认的命名空间中定义了三个属性:actor,mustUnderstand以及encodingStyle。这些被定义在SOAP头部的属性可通知容器如何对SOAP消息进⾏处理。
<Envelope
soap-env="/soap/envelope/"
encodingStyle="/soap/encoding/">
<Header>
<UserID auth=”some-URI”>
admin
</UserID>
</Header>
</Envelope>
4.3 Body
SOAP消息的Body块可以包含以下任何元素:
RPC⽅法及其参数
⽬标应⽤程序(消息接收者)专⽤数据
报告故障和状态消息的SOAP Fault
所有Body元素的直接⼦元素都称为Body项,Body项必须由命名空间修饰。
如下所⽰,该主体表⽰⽤于从“www.baidu”获取NBA球员名字的RPC调⽤。
<Envelope soap-env="/soap/envelope/"
encodingStyle="/soap/encoding/">
<Body>
<GetNBAName m=”www.baidu/NBA_name”>
<Item>NBA</Item>
</GetNBAName >
</Body>
</Envelope>
下⾯是对上述请求的响应:
<Envelope
soap-env="/soap/envelope/"
encodingStyle="/soap/encoding/">
<Body>
<GetNBANameResponse m=”www.baidu/NBA_name”>
<Name>LeBron James</Name>
</GetNBANameResponse>
</Body>
</Envelope>
4.4 Fault
SOAP Fault 元素⽤于存留 SOAP 消息的错误和状态信息。
可选的 SOAP Fault 元素⽤于指⽰错误消息。
如果已提供了 Fault 元素,则它必须是 Body 元素的⼦元素。在⼀条 SOAP 消息中,Fault 元素只能出现⼀次。
SOAP 的 Fault 元素拥有下列⼦元素:
⼦元素描述
<faultcode>供识别故障的代码。
<faultstring>可供⼈阅读的有关故障的说明。
<faultactor>有关是谁引发故障的信息。
<detail>存留涉及 Body 元素的应⽤程序专⽤错误信息。
在下⾯定义的 faultcode 值必须⽤于描述错误时的 faultcode 元素中:
错误描述
VersionMismatch SOAP Envelope 元素的⽆效命名空间被发现。
MustUnderstand Header元素的⼀个直接⼦元素(带有设置为 “1” 的 mustUnderstand 属性)⽆法被理解。
Client消息被不正确地构成,或包含了不正确的信息。
Server服务器有问题,因此⽆法处理进⾏下去。
5. HTTP协议
SOAP ⽅法指的是遵守 SOAP 编码规则的 HTTP 请求/响应。
HTTP + XML = SOAP
SOAP 请求可能是 HTTP POST 或 HTTP GET 请求。
HTTP POST 请求规定⾄少两个 HTTP 头:Content-Type 和 Content-Length。本⽂完。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论