一、SOAP是什么?
SOAP是一种轻量级协议,旨在在分散的分布式环境中交换结构化信息。 SOAP使用XML技术来定义可扩展的消息传递框架,该框架提供了可以在各种基础协议之间交换的消息构造。
-
通信协议
-
用于应用程序之间的通信
-
发送消息的格式
-
设计用于通过Internet通信
-
平台无关
-
语言无关
-
基于XML
-
简单且可扩展
-
允许绕过防火墙
-
一个W3C标准
简单的SOAP消息
复杂的SOAP消息
二、SOAP的作用
SOAP提供了一种使用不同的技术和编程语言在运行于不同操作系统上的应用程序之间进行通信的方法
SOAP提供了一个基于XML的消息传递框架
-
可扩展的
-
简洁仍然是SOAP的主要设计目标之一。
-
简单总是胜过效率或技术纯度。
-
SOAP定义了一个通信框架,该框架允许将功能添加为分层扩展。
-
-
可在各种基础网络协议上使用
-
可以在任何传输协议上使用 TCP、HTTP、SMTP
-
SOAP规范提供了一个灵活的框架,用于定义任意协议绑定
-
由于HTTP已被广泛使用,因此它今天为HTTP提供了显式绑定。
-
-
独立于编程模型,
-
允许任何编程模型,与远程过程调用无关
-
SOAP定义了用于处理单个单向消息的模型。 SOAP允许任何数量的消息交换模式(MEP)。
-
由于RPC的流行,SOAP概述了将RPC与SOAP一起使用的约定。
-
三、SOAP消息例子
请求消息
<soap:Envelope><soap:Body><m:GetBookPrice xmlns:m="http://www.amzn.org/books" /> <m:BookName>Fast Food Nation</m:BookName> </m:GetBookPrice></soap:Body></soap:Envelope>
回应消息
<soap:Envelope><soap:Body><m:GetBookPriceResponse xmlns:m="http://www.amzn.org/books" /><m:Price>34.5</m:Price></m:GetBookPriceResponse></soap:Body></soap:Envelope>
四、SOAP信封
SOAP消息包含在XML“信封”中,并带有标题和正文。
SOAP头是可选的,包含有关SOAP消息的特定于应用程序的信息(例如身份验证,付款等)
SOAP体是必需的,包含用于消息最终端点的实际SOAP消息。
五、SOAP头
-
一种扩展机制,提供了一种在SOAP消息中传递信息的方式,该信息不是应用程序有效负载。
-
这允许以特定于应用程序的方式扩展SOAP消息。
-
标头块可以分别针对在从发送者到最终接收者的消息路径中可能遇到的SOAP节点。
六、SOAP节点
SOAP假定消息具有一个发起者,一个或多个最终接收者以及零个或多个中介。SOAP消息的始发者,中介和接收者都称为SOAP节点。原因是支持分布式消息处理。实现此消息路由不在SOAP的范围之内。
头部有三个可选属性:
-
actor:确定是节点应处理特定的标头
-
mustUnderstand:如果设置为” true”,则节点必须知道如何处理头。
-
relay:指示是否应转发未处理的标头块。
七、协议绑定
-
SOAP消息传递框架独立于基础协议
-
具体的协议绑定准确定义了如何使用给定协议传输SOAP消息
-
定义了标准协议绑定,确保SOAP应用程序和基础结构之间的高度互操作性
-
SOAP1,1规范仅将HTTP的标准协议绑定编码
-
HTTP绑定:HTTP协议绑定定义了通过HTTP使用SOAP的规则。
-
SOAP:请求/响应自然地映射到HTTP请求/响应模型。
八、协议绑定——请求示例
<!--【HTTP头】-->POST /Temperature HTTP/1.1Host: www.weather.comContent-Type: text/xmlContent-Length: n<!-- 【XML负载均衡】--><s:Envelope xmlns:s=“http://www.w3.org/2001/06/soap-envelope"><s:Body>… …</s:Body></s:Envelope><wsdl:binding name="InventoryServiceSoapBinding" type="InventoryService"><soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/><wsdl:operation name="inquiryInventory"><soap:operation soapAction="http://abc.com/get"/><wsdl:input name="inquiryInventoryRequest"><soap:body use="literal"/></wsdl:input><wsdl:output name="inquiryInventoryResponse"><soap:body use="literal"/></wsdl:output></wsdl:operation></wsdl:binding>
九、WSDL与SOAP的绑定
-
soap标记:绑定有两个属性
-
style:“RPC”或者“document”
-
transport:定义要使用的SOAP协议
-
对于每个操作,需要定义相应的SOAP操作。 此外,需要指定输入和输出消息的编码方式。
-
十、SOAP消息风格
SOAP消息的两种基本风格
-
Document风格:表示 正文仅包含XML文档,发送者和接收者必须同意其格式。
-
RPC风格:表示 主体包含方法调用的XML表示形式
十一、Document风格的SOAP消息
<Envelope xmlns:s=“http://www.w3.org/2001/06/soap-envelope”><Body><purchaseOrder xmlns:n=“urn:OrderService”><from><person>Christopher Robin</person><dept>Accounting</dept></from><to><person>Pooh Bear</person><dept>Honey></dept></to><order><quantity>1</quantity><item>Pooh Stick</item></order></purchaseOrder></Body></Envelope>
十二、远程调用消息:典型的两种消息
十三、RPC风格的SOAP消息
<!--请求--><Envelope xmlns:s=“http://www.w3.org/2001/06/soap-envelope”><Body><getQuote xmlns:n=“urn:QuoteService”><symbol xsi:type=“xsd:string”>IBM</symbol></getQuote></Body></Envelope><!--响应--><Envelope xmlns:s=http://www.w3.org/2001/06/soap-envelope><Body><getQuoteResponse xmnls:n=“urn:QuoteService”><value xsi:type=“xsd:float”>98.06</value></getQuoteResponse></Body></Envelope>
十四、SOAP消息风格
有两种技术可以决定如何将数据序列化到主体中:(在WSDL的<soap:body>元素的use属性中指示)
Literal:架构定义从字面上定义了主体的XML格式,没有歧义。
Encoded:SOAP处理器必须在运行时遍历各种SOAP编码规则,以确定主体的正确序列化。
十五、总结
-
SOAP定义了一个简单且可扩展的XML消息传递框架,该框架可在具有多种不同编程模型的多种协议上使用。
-
基于XML和现有Internet协议的轻量级替代物,用于复杂的分布式对象技术。
-
该规范整理了如何在HTTP和RPC调用中使用SOAP。