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 封装的默认命名空间中:
    http://www.w3.org/2001/12/soap-envelope
    以及针对 SOAP 编码和数据类型的默认命名空间:
    http://www.w3.org/2001/12/soap-encoding

3. 语法规则

  • SOAP 消息必须用 XML 来编码
  • SOAP 消息必须使用 SOAP Envelope 命名空间
  • SOAP 消息必须使用 SOAP Encoding 命名空间
  • SOAP 消息不能包含 DTD 引用
  • SOAP 消息不能包含 XML 处理指令

4. 基本结构

<?xml version="1.0"?>
<soap:Envelope
	xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
	soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

<soap:Header>

</soap:Header>

<soap:Body>

  <soap:Fault>
  
  </soap:Fault>
  
</soap:Body>

</soap:Envelope>

4.1 Envelope

SOAP Envelope 是SOAP消息结构的主要容器,也是SOAP消息的根元素,它必须出现在每个SOAP消息中,用于把此XML文档标示为一条SOAP消息。
SOAP 1.1 规范:

<soap-env:Envelope 
	xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"
	Soap-env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
	
</soap-env:Envelope>

SOAP 1.2 规范:

<soap:Envelope 
	xmlns:soap="http://www.w3.org/2001/12/soap-envelope"
	  soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
	  
</soap: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消息进行处理。

<soap-env:Envelope 
	xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"
	Soap-env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">

   <soap-env:Header>
   
      <auth:UserID  xmlns:auth=”some-URI”>
      
          admin
          
      </auth:UserID>
      
   </soap-env:Header>

</soap-env:Envelope>

4.3 Body

SOAP消息的Body块可以包含以下任何元素:

  • RPC方法及其参数

  • 目标应用程序(消息接收者)专用数据

  • 报告故障和状态消息的SOAP Fault

所有Body元素的直接子元素都称为Body项,Body项必须由命名空间修饰。
如下所示,该主体表示用于从“www.baidu.com”获取NBA球员名字的RPC调用。

<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"
  Soap-env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">

   <soap-env:Body>
   
      <m:GetNBAName xmlns:m=”http://www.baidu.com/NBA_name”>
      
          <m:Item>NBA</m:Item>
          
      </m:GetNBAName >

   </soap-env:Body>

</soap-env:Envelope>

下面是对上述请求的响应:

<soap-env:Envelope 
	xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"
	Soap-env:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">

   <soap-env:Body>

      <m:GetNBANameResponse xmlns:m=”http://www.baidu.com/NBA_name”>

          <m:Name>LeBron James</m:Name>

      </m:GetNBANameResponse>

   </soap-env:Body>

</soap-env:Envelope>

4.4 Fault

SOAP Fault 元素用于存留 SOAP 消息的错误和状态信息。
可选的 SOAP Fault 元素用于指示错误消息。
如果已提供了 Fault 元素,则它必须是 Body 元素的子元素。在一条 SOAP 消息中,Fault 元素只能出现一次。
SOAP 的 Fault 元素拥有下列子元素:

子元素描述
<faultcode>供识别故障的代码。
<faultstring>可供人阅读的有关故障的说明。
<faultactor>有关是谁引发故障的信息。
<detail>存留涉及 Body 元素的应用程序专用错误信息。

在下面定义的 faultcode 值必须用于描述错误时的 faultcode 元素中:

错误描述
VersionMismatchSOAP 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。
本文完。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

探_无止境

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值