SOAP 简介
SOAP 是基于 XML 的简易协议,可使应用程序在 HTTP 之上进行信息交换。
或者更简单地说:SOAP 是用于访问网络服务的协议。
SOAP 语法
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
语法规则
这里是一些重要的语法规则:
- 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 消息的根元素。
必需的 SOAP 的 Envelope 元素是 SOAP 消息的根元素。它可把 XML 文档定义为 SOAP 消息。
请注意 xmlns:soap 命名空间的使用。它的值应当始终是:
http://www.w3.org/2001/12/soap-envelope
并且它可把封装定义为 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">
...
Message information goes here
...
</soap:Envelope>
xmlns:soap 命名空间
SOAP 消息必须拥有与命名空间 "http://www.w3.org/2001/12/soap-envelope" 相关联的一个 Envelope 元素。
如果使用了不同的命名空间,应用程序会发生错误,并抛弃此消息。
encodingStyle 属性
SOAP 的 encodingStyle 属性用于定义在文档中使用的数据类型。此属性可出现在任何 SOAP 元素中,并会被应用到元素的内容及元素的所有子元素上。SOAP 消息没有默认的编码方式。
语法
soap:encodingStyle="URI"
实例
<?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">
...
Message information goes here
...
</soap:Envelope>
SOAP Header 元素
可选的 SOAP Header 元素包含头部信息。
SOAP Header 元素
可选的 SOAP Header 元素可包含有关 SOAP 消息的应用程序专用信息(比如认证、支付等)。如果 Header 元素被提供,则它必须是 Envelope 元素的第一个子元素。
注释:
所有 Header 元素的直接子元素必须是合格的命名空间。
<?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>
<m:Trans
xmlns:m="http://www.w3school.com.cn/transaction/"
soap:mustUnderstand="1">234</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
上面的例子包含了一个带有一个 "Trans" 元素的头部,它的值是 234,此元素的 "mustUnderstand" 属性的值是 "1"。
SOAP 在默认的命名空间中 ("http://www.w3.org/2001/12/soap-envelope")
定义了三个属性。这三个属性是:actor、 mustUnderstand 以及 encodingStyle。这些被定义在 SOAP
头部的属性可定义容器如何对 SOAP 消息进行处理。
actor 属性
通过沿着消息路径经过不同的端点,SOAP 消息可从某个发送者传播到某个接收者。并非 SOAP 消息的所有部分均打算传送到 SOAP 消息的最终端点,不过,另一个方面,也许打算传送给消息路径上的一个或多个端点。
SOAP 的 actor 属性可被用于将 Header 元素寻址到一个特定的端点。
语法
soap:actor="URI"
实例
<?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>
<m:Trans
xmlns:m="http://www.w3school.com.cn/transaction/"
soap:actor="http://www.w3school.com.cn/appml/">
234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
mustUnderstand 属性
SOAP 的 mustUnderstand 属性可用于标识标题项对于要对其进行处理的接收者来说是强制的还是可选的。
假如您向 Header 元素的某个子元素添加了 "mustUnderstand="1",则它可指示处理此头部的接收者必须认可此元素。假如此接收者无法认可此元素,则在处理此头部时必须失效。
语法
soap:mustUnderstand="0|1"
实例
<?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>
<m:Trans
xmlns:m="http://www.w3school.com.cn/transaction/"
soap:mustUnderstand="1">
234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
encodingStyle 属性
SOAP 的 encodingStyle 属性在上一节中已解释过了。
SOAP Body 元素
强制使用的 SOAP Body 元素包含实际的 SOAP 消息。
SOAP Body 元素
必需的 SOAP Body 元素可包含打算传送到消息最终端点的实际 SOAP 消息。
SOAP Body 元素的直接子元素可以是合格的命名空间。SOAP
在默认的命名空间中("http://www.w3.org/2001/12/soap-envelope")定义了 Body
元素内部的一个元素。即 SOAP 的 Fault 元素,用于指示错误消息。
<?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>
<m:GetPrice xmlns:m="http://www.w3school.com.cn/prices">
<m:Item>Apples</m:Item>
</m:GetPrice>
</soap:Body>
</soap:Envelope>
上面的例子请求苹果的价格。请注意,上面的 m:GetPrice 和 Item 元素是应用程序专用的元素。它们并不是 SOAP 标准的一部分。
而一个 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:Body>
<m:GetPriceResponse xmlns:m="http://www.w3school.com.cn/prices">
<m:Price>1.90</m:Price>
</m:GetPriceResponse>
</soap:Body>
</soap:Envelope>
SOAP Fault 元素
可选的 SOAP Fault 元素用于存留 SOAP 消息的错误和状态信息。
SOAP Fault 元素
来自 SOAP 消息的错误消息被携带于 Fault 元素内部。
如果已提供了 Fault 元素,则它必须是 Body 元素的子元素。在一条 SOAP 消息中,Fault 元素只能出现一次。
SOAP 的 Fault 元素用于下列子元素:
子元素
描述
<faultcode> |
供识别故障的代码 |
<faultstring> |
可供人阅读的有关故障的说明 |
<faultactor> |
有关是谁引发故障的信息 |
<detail> |
存留涉及 Body 元素的应用程序专用错误信息 |
SOAP Fault Codes
在下面定义的 faultcode 值必须用于描述故障时的 faultcode 元素中:
错误
描述
VersionMismatch |
SOAP Envelope 元素的无效命名空间被发现 |
MustUnderstand |
Header 元素的一个直接子元素(带有设置为 "1" 的 mustUnderstand 属性)无法被理解。 |
Client |
消息被不正确地构成,或包含了不正确的信息。 |
Server |
服务器有问题,因此无法处理进行下去。 |
SOAP HTTP Binding
HTTP 协议
HTTP 在 TCP/IP 之上进行通信。HTTP 客户机使用 TCP 连接到 HTTP 服务器。在建立连接之后,客户机可向服务器发送 HTTP 请求消息:
POST /item HTTP/1.1
Host: 189.123.345.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
SOAP HTTP Binding
SOAP 方法指的是遵守 SOAP 编码规则的 HTTP 请求/响应。
HTTP + XML = SOAP
SOAP 请求可能是 HTTP POST 或 HTTP GET 请求。
HTTP POST 请求规定至少两个 HTTP 头:Content-Type 和 Content-Length。
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
Content-Length
SOAP 的请求和响应的 Content-Length 头规定请求或响应主体的字节数。
语法
Content-Length: bytes
例子
POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 250
SOAP 实例
一个 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>
分享到:
相关推荐
通过学习SOAP编程,开发者可以创建能够跨平台通信的服务和客户端,使得分布式系统间的交互变得简单而标准化。尽管现代Web服务更多地转向RESTful API,但SOAP仍然是许多遗留系统和特定场景下首选的通信协议。理解SOAP...
Web Service 学习 SOAP 协议简介 WSDL 简介 Web Service 概述 Web Service 是一种软件系统,旨在支持跨网络的机器间相互操作交互。它通常被定义为一组模块化的 API,可以通过网络进行调用,以执行远程系统的请求...
【学习 SOAP】.pdf
**SOAP(Simple Object Access Protocol)协议**是一种基于XML(Extensible Markup Language)的...深入学习SOAP协议,包括其消息结构、错误处理机制以及与WSDL和UDDI的协同工作,对于提升Web服务开发能力至关重要。
**SOAP学习手册** SOAP(Simple Object Access Protocol)是一种基于XML(Extensible Markup Language)的协议,...学习SOAP,不仅涉及其基本概念,还包括与其相关的WSDL、UDDI等技术,以及如何在实际项目中有效利用。
学习SOAP,你需要理解XML的基础,熟悉Web服务的概念,以及如何在Java或其他支持的编程语言中实现SOAP服务和客户端。通过这个简单的入门程序,你可以逐步掌握SOAP消息的构建、发送和解析,以及如何在实际应用中使用...
提供的PDF文档如《SOAP与Java编程指南》、《OReilly - Java And Soap》和《Soap Tutorial》都是学习SOAP编程的宝贵资料。`Soap+消息.doc`和`SOAPkehuduan.doc`可能包含了关于SOAP消息构造和部分的详细讲解。 通过...
这种方式虽然更底层,但也更具灵活性,适合自定义复杂的SOAP交互或学习SOAP通信的原理。 总的来说,Java发送SOAP报文涉及的关键技术包括XML解析、SOAP协议的理解、HTTP通信以及错误处理。通过阅读和理解这两个文件...
8. **实例与实践**:在学习SOAP编程时,通过实际的案例练习可以帮助理解如何创建服务、调用服务以及处理各种交互情况。例如,可以创建一个简单的天气查询服务,然后使用Java客户端进行调用。 通过阅读"oreilly - ...
SOAP(Simple Object Access Protocol)是一种基于XML的网络通信协议,用于在不同的应用程序之间交换结构化信息。...同时,这也是深入学习SOAP协议和C语言编程的一个好机会,有助于提升网络通信和XML处理的技能。
4. **理解SOAP**:学习SOAP消息的结构,掌握SOAPAction、Envelope、Header和Body等元素的作用。 5. **使用JAXP**:学习如何使用Java进行XML的解析和生成。 6. **学习JAXWS**:了解如何在Java中创建SOAP Web服务,...
学习SOAP,可以从理解其基本概念和消息结构开始,然后深入到WSDL和UDDI的理解,最后通过实际的开发项目来实践SOAP服务的创建和调用。"SOAP教程.pdf"这个文件很可能包含了详细的SOAP原理、语法示例和实践指导,可以...
学习SOAP通信,可以参考官方JAX-WS教程、Java SE API文档以及各种在线教程和Stack Overflow问题解答。对于C#开发者,微软的.NET官方文档和各种C# Web服务教程也是很好的资源。 总之,这个“SOAP实例程序,实现Java...
Java SOAP(Simple Object Access Protocol)学习资料主要涵盖了如何使用Java进行SOAP Web服务的开发、调用和交互。SOAP是一种基于XML的协议,用于在Web上交换结构化和类型化的信息。以下是一些重要的知识点: 1. *...
学习SOAP协议,开发者需要理解以下几个关键点: 1. **SOAP消息结构**:每个SOAP消息都由一个XML文档构成,包含Envelope、Header和Body三个部分。 2. **SOAP Envelope**:这是SOAP消息的基本结构,定义了消息的边界...
学习SOAP通常会涉及到实际的应用开发,例如使用Apache Axis创建Web服务。Axis是一个流行的Java Web服务框架,允许开发者快速地将Java类暴露为Web服务,或者消费其他服务。要使用Axis,需要按照以下步骤操作: 1. ...
### 利用Ruby的SOAP4R编写SOAP服务器的教程 #### 一、引言 SOAP (Simple Object Access Protocol),即简单对象访问协议,是一种基于XML的...无论是对于学习SOAP协议还是实际项目开发,SOAP4R都是一个值得尝试的选择。
学习SOAP,你需要理解其基本概念、消息结构、语法规则以及如何在实际项目中使用它来构建Web服务。此外,熟悉WSDL(Web Services Description Language)和UDDI(Universal Description, Discovery, and Integration...
这个源码包是为了学习和理解SOAP通信机制而提供的,特别是对于使用Qt开发跨平台应用程序的开发者来说,QtSoap提供了一个方便的工具。 首先,让我们深入了解一下SOAP。SOAP是一种轻量级的消息传递协议,它依赖于HTTP...
### SOAP协议规范中文解读 #### 1. SOAP简介 SOAP(Simple Object Access Protocol,简单对象访问协议)是一种轻量级的协议,它采用XML格式来发送...为了更深入地学习SOAP,建议参考官方的英文文档和相关的技术资料。