- SOAP代表简单对象访问P rotocol
- SOAP是一种应用程序通信协议
- SOAP是用于发送和接收消息的格式
- SOAP是独立于平台
- SOAP是基于XML的
- SOAP是一种W3C推荐
为什么SOAP?
Web应用程序,以便能够在互联网上进行通信是非常重要的。
应用程序之间进行沟通的最佳方式是通过HTTP,因为HTTP被所有的互联网浏览器和服务器的支持。 SOAP是为了做到这一点。
SOAP提供一种在不同的操作系统上运行,具有不同的技术和编程语言的应用程序之间进行通信。
SOAP构建模块
SOAP消息是包含以下元素一个普通的XML文档:
- 标识XML文档作为SOAP消息的Envelope元素
- 包含的头部信息Header元素
- 包含呼叫和响应信息的主体元素
- 包含错误的信息和状态信息的故障元
所有元素都在SOAP信封的默认命名空间中声明:
http://www.w3.org/2003/05/soap-envelope/
和SOAP编码和数据类型的默认命名空间是:
http://www.w3.org/2003/05/soap-encoding
语法规则
以下是一些重要的语法规则:
- SOAP消息必须用XML来编码
- SOAP消息必须使用SOAP信封命名空间
- 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信封元素
所需的SOAP封装元件是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">
...
Message information goes here
...
</soap:Envelope>
该的xmlns:soap命名空间
注意到的xmlns:在上面的例子皂命名空间。 它应该总是价值: "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">
...
Message information goes here
...
</soap:Envelope>
SOAP头元素
可选的SOAP Header元素包含应用程序特定的信息(like authentication, payment, etc)有关SOAP消息。
如果标题元素是存在的,它必须是Envelope元素的第一个子元素。
Note: 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.w3ii.com/transaction/"
soap:mustUnderstand="1">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
上面的例子中包含一个首标"Trans"元素, "mustUnderstand"为1的值的属性,和234的值。
SOAP定义了默认的命名空间三种属性。 这些属性是:mustUnderstand属性,演员,encodingStyle的。
在SOAP Header中定义的属性定义收件人应如何处理SOAP消息。
该mustUnderstand属性
在SOAP mustUnderstand属性可以被用于指示一个头项是强制的还是可选的接收方处理。
如果添加的mustUnderstand =“1”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.w3ii.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.w3ii.com/transaction/"
soap:actor="http://www.w3ii.com/appml/">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
该encodingStyle属性
所述encodingStyle属性用于定义文档中使用的数据类型。 这个属性可能会出现在任何SOAP元素,它将适用于该元素的内容和所有子元素。
SOAP消息没有默认的编码。
句法
soap:encodingStyle="URI"
SOAP体元素
所需的SOAP Body元素包含用于该消息的最终端点的实际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:GetPrice xmlns:m="http://www.w3ii.com/prices">
<m:Item>Apples</m:Item>
</m:GetPrice>
</soap:Body>
</soap:Envelope>
上面的例子请求苹果的价格。 需要注意的是第m:上述GetPrice和项目元素是应用程序特定的元件。 它们不是在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.w3ii.com/prices">
<m:Price>1.90</m:Price>
</m:GetPriceResponse>
</soap:Body>
</soap:Envelope>
SOAP错误元素
可选的SOAP故障元件用于指示错误消息。
SOAP错误元素包含SOAP消息的错误和状态信息。
如果故障元素是存在的,它必须是Body元素的子元素。 的故障元素只能在SOAP消息中出现一次。
SOAP错误元素具有以下子元素:
子元素 | 描述 |
---|---|
<faultcode> | 一种用于识别故障代码 |
<faultstring> | 故障的可读解释 |
<faultactor> | 是谁造成的故障的信息 |
<detail> | 持有相关的主体元素应用特定的错误信息 |
SOAP故障代码
下面定义的faultcode值必须在faultcode元素描述故障时,可以使用:
错误 | 描述 |
---|---|
VersionMismatch | 发现SOAP信封元素的无效命名空间 |
MustUnderstand | Header元素的一个直接子元素,用mustUnderstand属性设置为"1"不被理解 |
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 Bindings" 。 SOAP绑定机制允许SOAP消息使用传输协议进行有效交换。
大多数的SOAP实现提供了常见的传输协议,如HTTP或SMTP的绑定。
HTTP是同步并广泛使用。 一个SOAP HTTP请求规定至少两个HTTP头:Content-Type和Content-Length的。
SMTP是异步的,在万不得已或特定的情况下使用。
SOAP的Java实现通常提供特定的JMS绑定(Java Messaging System)协议。
内容类型
一个SOAP请求和响应的Content-Type头定义MIME类型消息和字符编码(optional)用于请求或响应的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: bytes
例
POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 250
一个SOAP实例
在下面的例子中,一个GetStockPrice请求被发送到服务器。 该请求具有StockName参数,这将在响应中返回一个价格参数。 该函数的命名空间中定义的"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>