XML Soap
-
定义和使用
SOAP 代表简单对象访问协议SOAP 是一种应用程序通信协议SOAP 是一种用于发送和接收消息的格式SOAP 与平台无关SOAP 基于 XMLSOAP 是 W3C 的建议SOAP 构建块
SOAP 消息是包含以下元素的普通XML文档:- 将 XML 文档标识为 SOAP 消息的 Envelope 元素
- 包含标题信息的 Header 元素
- 包含通话和响应信息的 Body 元素
- 包含错误和状态信息的故障元素
以下是一些重要的语法规则:- SOAP消息必须使用XML进行编码
- SOAP消息必须使用SOAP Envelope命名空间
- SOAP消息必须使用SOAP编码名称空间
- SOAP消息不得包含DTD参考
- SOAP消息不得包含XML处理指令
骨架 SOAP 消息<?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope/" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding"> <soap:Header> ... </soap:Header> <soap:Body> ... <soap:Fault> ... </soap:Fault> </soap:Body> </soap:Envelope>
必需的 SOAP Envelope 元素是 SOAP 消息的根元素。 此元素将XML文档定义为 SOAP 消息。骨架 SOAP 消息<?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope/" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding"> ... Message information goes here ... </soap:Envelope>
注意上面示例中的 xmlns:soap 命名空间。 它的值应始终为:"http://www.w3.org/2003/05/soap-envelope/"。命名空间将信封定义为SOAP信封。如果使用其他名称空间,则应用程序将生成错误并丢弃消息。 -
encodingStyle 属性
encodingStyle 属性用于定义文档中使用的数据类型。 此属性可以出现在任何 SOAP 元素上,并且适用于该元素的内容和所有子元素。SOAP 消息没有默认编码。语法soap:encodingStyle="URI"
示例<?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope/" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding"> ... 消息信息在这里 ... </soap:Envelope>
-
SOAP 标头元素
可选的 SOAP Header 元素包含有关 SOAP 消息的特定于应用程序的信息(例如,身份验证,付款等)。如果存在 Header 元素,则它必须是 Envelope 元素的第一个子元素。注意:Header 元素的所有直接子元素必须是名称空间限定的。<?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope/" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding"> <soap:Header> <m:Trans xmlns:m="http://www.w3schools.com/transaction/" soap:mustUnderstand="1">234 </m:Trans> </soap:Header> ... ... </soap:Envelope>
上面的示例包含带有 "Trans" 元素的标头,值为 1 的 "mustUnderstand" 属性和值为 234。SOAP 在默认名称空间中定义了三个属性。 这些属性是:mustUnderstand,actor和encodingStyle。SOAP 标头中定义的属性定义了接收者应如何处理 SOAP 消息。 -
mustUnderstand 属性
SOAP mustUnderstand 属性可用于指示标题条目对于接收者来说是必需的还是可选的。如果将 mustUnderstand ="1" 添加到 Header 元素的子元素,则表明处理 Header 的接收者必须识别该元素。 如果接收方无法识别该元素,则在处理标头时它将失败。语法soap:mustUnderstand="0|1"
示例<?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope/" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding"> <soap:Header> <m:Trans xmlns:m="http://www.w3schools.com/transaction/" soap:mustUnderstand="1">234 </m:Trans> </soap:Header> ... ... </soap:Envelope>
-
actor 属性
通过沿着消息路径传递不同的端点,SOAP 消息可以从发送者传播到接收者。 但是,并非 SOAP 消息的所有部分都可以用于最终端点,而是可以用于消息路径上的一个或多个端点。SOAP actor 属性用于将 Header 元素寻址到特定端点。语法soap:actor="URI"
示例<?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope/" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding"> <soap:Header> <m:Trans xmlns:m="http://www.w3schools.com/transaction/" soap:actor="http://www.w3schools.com/appml/">234 </m:Trans> </soap:Header> ... ... </soap:Envelope>
-
encodingStyle 属性
encodingStyle 属性用于定义文档中使用的数据类型。 此属性可以出现在任何 SOAP 元素上,并将应用于该元素的内容和所有子元素。SOAP消息没有默认编码。语法soap:encodingStyle="URI"
-
SOAP 主体元素
必需的 SOAP Body 元素包含用于消息最终端点的实际 SOAP 消息。SOAP Body 元素的直接子元素可以是名称空间限定的。<?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope/" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding"> <soap:Body> <m:GetPrice xmlns:m="http://www.w3schools.com/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/2003/05/soap-envelope/" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding"> <soap:Body> <m:GetPriceResponse xmlns:m="http://www.w3schools.com/prices"> <m:Price>1.90</m:Price> </m:GetPriceResponse> </soap:Body> </soap:Envelope>
-
SOAP Fault 元素
可选的 SOAP Fault 元素用于指示错误消息。SOAP Fault 元素保存 SOAP 消息的错误和状态信息。如果存在 Fault 元素,则它必须显示为 Body 元素的子元素。 Fault 元素只能在 SOAP 消息中出现一次。SOAP Fault 元素具有以下子元素:子元素 描述 <faultcode> 识别故障的代码 <faultstring> 易于理解的故障解释 <faultactor> 有关由谁引起故障的信息 <detail> 包含与Body元素相关的应用程序特定的错误信息 -
SOAP 故障代码
描述故障时,必须在故障代码元素中使用以下定义的故障代码值:Error 描述 VersionMismatch 为SOAP Envelope元素找到了无效的名称空间 MustUnderstand 必须理解 MustUnderstand 必须将 mustUnderstand 属性设置为 "1" 的 Header 元素的直接子元素。 Client 邮件格式不正确或包含错误信息 Server 服务器出现问题,因此消息无法继续 -
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
SOAP 规范定义 SOAP 消息的结构,而不是如何交换它们。 所谓的 "SOAP绑定" 填补了这一空白。 SOAP 绑定是允许使用传输协议有效交换 SOAP 消息的机制。大多数 SOAP 实现都为常见的传输协议(例如HTTP或SMTP)提供绑定。HTTP 是同步的并且被广泛使用。 SOAP HTTP 请求至少指定两个 HTTP 标头:Content-Type 和 Content-Length。SMTP 是异步的,在万不得已时或在特定情况下使用。SOAP 的 Java 实现通常为 JMS(Java消息系统)协议提供特定的绑定。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 示例
在下面的示例中,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/2003/05/soap-envelope/" soap:encodingStyle="http://www.w3.org/2003/05/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/2003/05/soap-envelope/" soap:encodingStyle="http://www.w3.org/2003/05/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>