1. SOAP
1.1 概念
SOAP 提供了一种标准的方法,使得运行在不同平台并使用不同的技术和编程语言的应用程序可以互相进行 XML 通信。从本质上来说,SOAP 并不是一个网络传输协议,它仅仅是一个信息传递的概念性框架,在实际使用时,需要绑定具体的网络传输协议和上层的应用逻辑来创建关联。
1.2 作用
- SOAP 提供了基于 XML 的信息定义方式,用以在去中心化的分布环境中,提供点到点的结构化、带类型的信息交互。
- SOAP 使用 XML 定义了可扩展的消息架构,该消息架构提供了能够基于多种底层协议,进行信息交换的信息架构。
- 该架构独立于具体编程模型以及其它的实现相关语义(至于具体如何使用网络协议进行传输,交给另外的协议,比如 SOAP Binding)。
- SOAP 从概念上提供了单向、不带状态的消息交互范式。
- SOAP 提供:
- 以可扩展方式传送应用相关信息的架构
- SOAP 节点在收到 SOAP 消息后,所需要执行的必要操作
- SOAP 不关心:
- 它所携带的应用相关数据的语义(就像信封不关心在信封中装的是支票还是邮件)
- 诸如 SOAP 消息的路由、可靠信息传输、防火墙穿越等事项
1.3 SOAP 两种使用方式
基于中间有无转发节点,可以将 SOAP 的使用方式划分为两类:
- 没有中间转发节点,之间点到点(peer to peer)传输消息
- 有多个中间转发节点
1.4 SOAP 两种交互模式
- RPC(远程过程调用)模式
- 同步的请求/应答交互模式
- 发送请求并等待响应
【RPC 模式下的一些约定俗成】
- 请求 XML 文档中间所包含的方法名应该和远程的方法名称保持一致,并且需要在 XML 文档中间一种序列化方法(用于将 XML 转为远端的二进制调用)
- 应答 XML 文档中间应包含方法名称 Response作为元素
- 应答 XML 中用
<rpc:result>...</rpc:result>
来承载方法的返回值
- 面向文档模式(大多数情况)
- 异步交互模式
- 发送复杂的 XML 文档,并等待通知。结果会在处理后发回
1.5 SOAP 结构
- Header 体现了 SOAP 的可扩展性(可添加各种控制信息)
- Body 中嵌套 XML 文档,用来传递主要数据内容
1.6 SOAP 绑定(SOAP Binding)
- 在抽象的消息交互框架中,SOAP 消息需要使用底层协议完成传输
- 如何使用底层协议完成 SOAP 消息的封装、处理和传输,由 SOAP 绑定进行定义
- 最常见的 SOAP 绑定是 HTTP 绑定,该绑定使用 Web 方法(GET 和 POST),采用 HTTP 消息交互的方式,支持 SOAP 消息传递
- 其他绑定还可以有;SMTP、HTTPS、MIME 等
2. WSDL
2.1 概念
WSDL 是 Web Service 接口定义语言,用来描述 Web Service 的服务接口。WSDL 提供了一种基于 XML 的标准接口定义语言/服务能力定义语言,用以在服务的提供者/调用者/服务注册之间,交换必要的有关 Web Service 的信息。
2.2 作用
- WSDL 是用以描述网络服务的 XML 格式,它将服务描述为基于消息(面向文档/面向过程)运作的端点集合
- WSDL 回答
- 服务用来干什么
- 服务在哪
- 如何调用服务
- WSDL 提供
- 功能信息
- 消息结构(如何说明消息交互中的数据类型)
- 协议绑定(如何将抽象消息映射为具体的网络传输)
【注】WSDL、SOAP 和 XML Schema 会被同时使用。
2.3 结构
- WSDL 2.0 信息集结构
- import、include :主要用来对于撰写在多个文档中间的 WSDL 信息进行拼接,前者用于从不同的名称空间引入,后者用于从相同的名称空间引入
- types :用来说明消息结构
- interface :用来指定抽象意义下服务所提供的能力的相关接口
- binding :用来将 inerface 指定的抽象的消息格式转为具体的消息格式
- service :通过聚合 endpoint 在 interface 和 binding 之间来创建映射关系
2.4 应用举例
基于WSDL 2.0 :
- 定义声明和名称空间
- 定义消息类型 types
【注】消息类型既可以在当前文件中定义,也可以在独立的文文件中定义,然后通过 import、include 机制导入。
- 定义接口 interface
【注】MEP 预定义有 8 种,也可以自定义 MEP 。基本 4 种如下,若每一种再加上出错处理,就得到另外 4 种。
- 定义绑定 binding
- 定义服务 service
使用RPC风格 :
2.5 WSDL 简化结构
- 抽象部分:关于服务的能力进行描述
- 具体部分:关于服务的调用进行描述
【注】不同的服务提供者都可以根据相同的抽象部分来定义不同的具体部分,从而构造出一组共享实现相同相似能力的服务。