什么是WebServcie
网上有很多解释版本。我是技术研发,所以个人理解从技术角度说:Web Service是一种轻量级别的基于XML的跨平台远程服务通讯框架技术,可以很好解决各平台和语言间的数据通讯。
- 语意协议:使用基于XML的SOAP协议,定义业务数据格式。
- 传输协议:使用HTTP,TPC/IP,FTP,SMTP和JMS等,一般采用和支持较多的是HTTP。
- 接口描述语言:使用基于XML的WDSL作为统一服务描述。
SOAP
简单对象访问协议(SOAP:Simple Object Access Protocol)是一种轻量的、简单的、基于 XML 的协议,它被设计成在 WEB 上交换结构化的和固化的信息。主要负责在WEBSERVICE服务中通讯报文数据格式的定义。 SOAP 可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议( HTTP),简单邮件传输协议(SMTP),多用途网际邮件扩充协议(MIME),传统SOCKET通讯(TCP/IP),JAVA消息系统(JMS)等传输协议。它还支持从消息系统到远程过程调用(RPC)等大量的应用程序。
SOAP 包括三个部分:
- SOAP 封装:它定义了一个框架,该框架描述了消息中的内容是什么,谁应当处理它以及它是可选的还是必须的。
- SOAP 编码规则:它定义了一种序列化的机制,用于交换应用程序所定义的数据类型的实例。
- SOAP RPC 表示:它定义了用于表示远程过程调用和应答的协定。
SOAP 消息基本上是从发送端到接收端的单向传输,但它们常常结合起来执行类似于请求 / 应答的模式。所有的 SOAP 消息都使用 XML 编码。一条 SOAP 消息就是一个包含有一个必需的 SOAP 的封装包,一个可选的 SOAP 标头和一个必需的 SOAP 体块的 XML 文档。
把 SOAP 绑定到 HTTP 提供了同时利用 SOAP 的样式和分散的灵活性的特点以及 HTTP 的丰富的特征库的优点。在 HTTP 上传送 SOAP 并不是说 SOAP 会覆盖现有的 HTTP 语义,而是 HTTP 上的 SOAP 语义会自然的映射到 HTTP 语义。在使用 HTTP 作为协议绑定的场合中, RPC 请求映射到 HTTP 请求上,而 RPC 应答映射到 HTTP 应答。简单的说就是,通过HTTP POST(当然也可以GET或其它,一般是POST)方式传输一个SOAP协议定义的报文数据体,用于双向通讯。然而,在 RPC 上使用 SOAP 并不仅限于 HTTP 协议绑定,也可以和其他的现行传输协议绑定。
语法规则
- SOAP 消息必须用 XML 来编码
- SOAP 消息必须使用 SOAP Envelope 命名空间
- SOAP 消息必须使用 SOAP Encoding 命名空间
- SOAP 消息不能包含 DTD 引用
- SOAP 消息不能包含 XML 处理指令
SOAP报文结构
一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素:
- 必需的 Envelope标签,文档的ROOT,可把此 XML 文档标识为一条 SOAP 消息
必需的 SOAP 的 Envelope 元素是 SOAP 消息的根元素。它可把 XML 文档定义为 SOAP 消息 - 可选的 Header标签,包含头部信息
可选的 SOAP Header 元素可包含有关 SOAP 消息的应用程序专用信息(比如认证、支付等)。如果 Header 元素被提供,则它必须是 Envelope 元素的第一个子元素。 - 必需的 Body标签,包含所有的调用和响应信息
必需的 SOAP Body 元素可包含打算传送到消息最终端点的实际 SOAP 消息。
SOAP Body 元素的直接子元素可以是合格的命名空间。SOAP 在默认的命名空间中("http://www.w3.org/2001/12/soap-envelope")定义了 Body 元素内部的一个元素。即 SOAP 的 Fault 元素,用于指示错误消息。
- 可选的 Fault 元素,提供有关在处理此消息所发生错误的信息
来自 SOAP 消息的错误消息被携带于 Fault 元素内部。
如果已提供了 Fault 元素,则它必须是 Body 元素的子元素。在一条 SOAP 消息中,Fault 元素只能出现一次。
SOAP 的 Fault 元素用于下列子元素:
子元素 描述 <faultcode> 供识别故障的代码 <faultstring> 可供人阅读的有关故障的说明 <faultactor> 有关是谁引发故障的信息 <detail> 存留涉及 Body 元素的应用程序专用错误信息
< SOAP-ENV:Envelope xmlns:SOAP-ENV ="http://schemas.xmlsoap.org/soap/envelope/" //SOAP报文默认命名空间
xmlns:SOAP-ENC ="http://schemas.xmlsoap.org/soap/encoding/" //编码数据类型命名空间
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" //文档XSD实例方案,规定格式
xmlns:xsd ="http://www.w3.org/2001/XMLSchema" > //文档XSD方案,规定格式
<!-- 信头 -->
<SOAP-ENV:HEADER></SOAP-ENV:HEADER>
<!-- 信体 -->
< SOAP-ENV:Body >
< m:activateEpurse xmlns:m ="http://service.payment.ipayment.justinmobile.com" >
< m:appNo > String </ m:appNo >
< m:mobileNo > String </ m:mobileNo >
</ m:activateEpurse >
</ SOAP-ENV:Body >
</ SOAP-ENV:Envelope >
SOAP应答报文(返回一个entry数组,也就是MAP)
< soap:Body >
< ns1:activateEpurseResponse xmlns:ns1 ="http://service.payment.ipayment.justinmobile.com" >
< ns1:out >
< entry xmlns ="http://service.payment.ipayment.justinmobile.com" >
< key > transStatus </ key >
< value > 0001 </ value >
</ entry >
</ ns1:out >
</ ns1:activateEpurseResponse >
</ soap:Body >
</ soap:Envelope >
所有以上的元素均被声明于针对 SOAP 封装的默认命名空间中:
http://www.w3.org/2001/12/soap-envelope
SOAP 在默认的命名空间中 ("http://www.w3.org/2001/12/soap-envelope") 定义了三个属性。这三个属性是:actor、 mustUnderstand 以及 encodingStyle。这些被定义在 SOAP 头部的属性可定义容器如何对 SOAP 消息进行处理。
actor
通过沿着消息路径经过不同的端点,SOAP 消息可从某个发送者传播到某个接收者。并非 SOAP 消息的所有部分均打算传送到 SOAP 消息的最终端点,不过,另一个方面,也许打算传送给消息路径上的一个或多个端点。
SOAP 的 actor 属性可被用于将 Header 元素寻址到一个特定的端点。
soap:actor="URI"
mustUnderstand
SOAP 的 mustUnderstand 属性可用于标识标题项对于要对其进行处理的接收者来说是强制的还是可选的。
假如您向 Header 元素的某个子元素添加了 "mustUnderstand="1",则它可指示处理此头部的接收者必须认可此元素。假如此接收者无法认可此元素,则在处理此头部时必须失效。
soap:mustUnderstand="0|1"
encodingStyle
SOAP 的 encodingStyle 属性用于定义在文档中使用的数据类型。此属性可出现在任何 SOAP 元素中,并会被应用到元素的内容及元素的所有子元素上。SOAP 消息没有默认的编码方式。
soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"
以及针对 SOAP 编码和数据类型的默认命名空间:
http://www.w3.org/2001/12/soap-encoding