当前位置: 首页 > article >正文

Web Service(三)—— SOAP学习

一、SOAP 简介

SOAP 是基于 XML 的简易协议,可使应用程序在 HTTP 之上进行信息交换。

或者更简单地说:SOAP 是用于访问网络服务的协议

1、什么是 SOAP

  • SOAP 指简易对象访问协议
  • SOAP 是一种通信协议
  • SOAP 用于应用程序之间的通信
  • SOAP 是一种用于发送消息的格式
  • SOAP 被设计用来通过因特网进行通信
  • SOAP 独立于平台
  • SOAP 独立于语言
  • SOAP 基于 XML
  • SOAP 很简单并可扩展
  • SOAP 允许您绕过防火墙
  • SOAP 将被作为 W3C 标准来发展

为什么使用 SOAP?

SOAP 提供了一种标准的方法,使得运行在不同的操作系统并使用不同的技术和编程语言的应用程序可以互相进行通信。

二、SOAP 语法

1. SOAP 构建模块 

一条 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

2. 语法规则

重要的语法规则:

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

SOAP 消息的基本结构:

<?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>

SOAP Envelope 元素

强制使用的 SOAP 的 Envelope 元素是 SOAP 消息的根元素。它可把 XML 文档定义为 SOAP 消息。

xmlns:soap 命名空间

SOAP 消息必须拥有与命名空间 "http://www.w3.org/2001/12/soap-envelope" 相关联的一个 Envelope 元素。

如果使用了不同的命名空间,应用程序会发生错误,并抛弃此消息。

encodingStyle 属性用于定义在文档中使用的数据类型。此属性可出现在任何 SOAP 元素中,并会被应用到元素的内容及元素的所有子元素上。

SOAP 消息没有默认的编码方式。

SOAP Header 元素

可选的 SOAP Header 元素包含头部信息。如果 Header 元素被提供,则它必须是 Envelope 元素的第一个子元素。

注意: 所有 Header 元素的直接子元素必须是合格的命名空间。 

SOAP Body 元素

必需的 SOAP Body 元素可包含打算传送到消息最终端点的实际 SOAP 消息

SOAP Fault 元素

可选的 SOAP Fault 元素用于指示错误消息。如果已提供了 Fault 元素,则它必须是 Body 元素的子元素。在一条 SOAP 消息中,Fault 元素只能出现一次。

SOAP 的 Fault 元素拥有下列子元素:

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

SOAP Fault 代码

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

错误描述
VersionMismatchSOAP Envelope 元素的无效命名空间被发现
MustUnderstandHeader 元素的一个直接子元素(带有设置为 "1" 的 mustUnderstand 属性)无法被理解。
Client消息被不正确地构成,或包含了不正确的信息。
Server服务器有问题,因此无法处理进行下去。

三、SOAP HTTP 协议 

3.1 HTTP 协议

HTTP 在 TCP/IP 之上进行通信。HTTP 客户机使用 TCP 连接到 HTTP 服务器。在建立连接之后,客户机可向服务器发送 HTTP 请求消息:

POST /item HTTP/1.1
Host: 189.123.255.239
Content-Type: text/plain
Content-Length: 200

随后服务器会处理此请求,然后向客户机发送一个 HTTP 响应。此响应包含了可指示请求状态的状态代码:

200 OK
Content-Type: text/plain
Content-Length: 200

在上面的例子中,服务器返回了一个 200 的状态代码。这是 HTTP 的标准成功代码。假如服务器无法对请求进行解码,它可能会返回类似这样的信息:

400 Bad Request
Content-Length: 0

3.2 SOAP HTTP Binding

SOAP 方法指的是遵守 SOAP 编码规则的 HTTP 请求/响应。

HTTP + XML = SOAP

SOAP 请求可能是 HTTP POST 或 HTTP GET 请求。

HTTP POST 请求规定至少两个 HTTP 头:Content-Type 和 Content-Length

3.2.1 Content-Type

SOAP 的请求和响应的 Content-Type 头可定义消息的 MIME 类型,以及用于请求或响应的 XML 主体的字符编码(可选)。

// 语法: Content-Type: MIMEType; charset=character-encoding

POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8

3.2.2 Content-Length

SOAP 的请求和响应的 Content-Length 头规定请求或响应主体的字节数

// 语法: Content-Length: bytes

POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 250

3.3 一个 SOAP 实例

一个 GetStockPrice 请求被发送到了服务器。此请求有一个 StockName 参数,而在响应中则会返回一个 Price 参数。此功能的命名空间被定义在此地址中: "http://www.example.org/stock" 

SOAP 请求:

POST /InStock HTTP/1.1
Host: www.example.org
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn

<?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:Body xmlns:m="http://www.example.org/stock">
  <m:GetStockPrice>
    <m:StockName>IBM</m:StockName>
  </m:GetStockPrice>
</soap:Body>

</soap:Envelope>

SOAP 响应:

HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn

<?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:Body xmlns:m="http://www.example.org/stock">
  <m:GetStockPriceResponse>
    <m:Price>34.5</m:Price>
  </m:GetStockPriceResponse>
</soap:Body>

</soap:Envelope>


http://www.kler.cn/a/14821.html

相关文章:

  • Linux进程层次分析
  • 【SWAT水文模型】ArcSWAT输入准备
  • 学会SpringBoot的第一天(超详细)
  • 案例01-tlias智能学习辅助系统02-文件上传
  • 基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)
  • 详解为什么C++ 虚拟成员函数模板不被允许
  • mybatis配置文件详解
  • 记录-有意思的气泡 Loading 效果
  • Redis入门学习笔记【二】Redis缓存
  • OSCP-Sirol(docker容器到宿主机)
  • 10 【Sass语法介绍-继承】
  • 驾考新规记分口诀,1分、3分、6分、9分、12分口诀帮你记
  • 数据库原理容易出错的点
  • 计算多列迭代次数的一种平均列近似方法
  • vue3+vite3+typescript使用wangEditor编辑器
  • 新项目如何选择vue和react
  • 再也不去字节跳动面试了,6年测开经验的真实面试经历.....
  • 新品首发丨计讯物联5G水利遥测终端机TY511-B3,推动5G+智慧水利再进化
  • nginx反向代理负载均衡
  • MetalLB暴露的VIP部分端口不通