WebService CXF SOAP基本结构

SOAP 是基于 XML 的简易协议,可使应用程序在 HTTP 之上进行信息交换。或者更简单地说:SOAP 是用于访问网络服务的协议。 

    SOAP定义了一个envelope对象,使用envelope来包装要传递的消息,而消息本身可以采用自身特定的词汇,使用namespace来区分彼此。

    简单的说,在WebService中传递的东西是一封信,SOAP就是信的通用格式,他定义了一封信应该有信封,信封里装着信的内容,信封(envlope)的格式是固定的,而信的内容(要传递的数据)你可以自己定义。


    您应当具备的基础知识 
    在继续学习之前,您需要对下面的知识有基本的了解: 
        * XML 
        * XML 命名空间 

什么是SOAP?

 对于应用程序开发来说,使程序之间进行因特网通信是很重要的。 
    目前的应用程序通过使用远程过程调用(RPC)在诸如 DCOM 与 CORBA 等对象之间进行通信,但是 HTTP 不是为此设计的。RPC 会产生兼容性以及安全问题;防火墙和代理服务器通常会阻止此类流量。 
    通过 HTTP 在应用程序间通信是更好的方法,因为 HTTP 得到了所有的因特网浏览器及服务器的支持。SOAP 就是被创造出来完成这个任务的。 
    SOAP 提供了一种标准的方法,使得运行在不同的操作系统并使用不同的技术和编程语言的应用程序可以互相进行通信。 

 

 SOAP远程过程调用(RPC)与消息传递(DOCUMENT)

  Web service本身实际是在实现应用程序间的通信,实现通信的方式有两种:

  远程过程调用(RPC)和消息传递(DOCUMENT)。

 使用 RPC的时候,客户端的概念是调用服务器上的远程过程,通 常方式为实例化一个远程对象并调用其方法和属性。

 消息传递的概念是,客户端向服务器发送消息,然后等待服务器的回应。消息传递系统强调的是消息的发送和回应,而不  是远程对象的界面。

  他们最大不同就是RPC不能通过Schema 来校验,而Document 类型是可以的。因此document 类型webservice成为主流 ,Document也是JAX-WS默认的实现方式。

    有一种说法是,Web Service = SOAP + WSDL + HTTP。其中,SOAP协议是web service的主体,它通过HTTP或者SMTP等应用层协议进行通讯,自身使用XML文件来描述程序的函数方法和参数信息,从而完成不同主机的异构系统间的服务处理。这里的WSDL(Web Services Description Language)web 服务描述语言也是一个XML文档,它通过HTTP向公众发布,公告客户端程序关于某个具体的 Web service服务的URL信息、方法的命名,参数,返回值等。

 

SOAP 1.1 被提交到 W3C 
    在 2000 年 5 月,UserLand、Ariba、Commerce One、Compaq、Developmentor、HP、IBM、IONA、Lotus、Microsoft 以及 SAP 向 W3C 提交了 SOAP 因特网协议,这些公司期望此协议能够通过使用因特网标准(HTTP 以及 XML)把图形用户界面桌面应用程序连接到强大的因特网服务器,以此来彻底变革应用程序的开发。 
   
W3C 正在发展 SOAP 1.2 
   首个关于 SOAP 的公共工作草案由 W3C 在 2001 年 12 月发布。如需阅读更多有关在 W3C 的 SOAP 活动的内容,请访问我们的《W3C 教程》。 
   
SOAP 构建模块 
    一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素: 
    * 必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息 
    * 可选的 Header 元素,包含头部信息的XML标签 
    * 必需的 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 消息的基本结构 
Java代码  
Java代码 trans.gif  收藏代码
  1. <?xml version="1.0"?>     
  2. <soap:Envelope     
  3. xmlns:soap="http://www.w3.org/2001/12/soap-envelope"    
  4. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">     
  5.     
  6. <soap:Header>     
  7.   ...     
  8.   ...     
  9. </soap:Header>     
  10.     
  11. <soap:Body>     
  12.   ...     
  13.   ...     
  14.   <soap:Fault>     
  15.     ...     
  16.     ...     
  17.   </soap:Fault>     
  18. </soap:Body>     
  19.     
  20. </soap:Envelope>    
  21.   
  22. <?xml version="1.0"?>  
  23. <soap:Envelope  
  24. xmlns:soap="http://www.w3.org/2001/12/soap-envelope"  
  25. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">  
  26.   
  27. <soap:Header>  
  28.   ...  
  29.   ...  
  30. </soap:Header>  
  31.   
  32. <soap:Body>  
  33.   ...  
  34.   ...  
  35.   <soap:Fault>  
  36.     ...  
  37.     ...  
  38.   </soap:Fault>  
  39. </soap:Body>  
  40.   
  41. </soap:Envelope>  

SOAP Envelope 元素 
    必需的 SOAP 的 Envelope 元素是 SOAP 消息的根元素。它可把 XML 文档定义为 SOAP 消息。 
    请注意 xmlns:soap 命名空间的使用。它的值应当始终是: 
Java代码  
http://www.w3.org/2001/12/soap-envelope  

http://www.w3.org/2001/12/soap-envelope 
    并且它可把封装定义为 SOAP 封装: 
Java代码  
Java代码 trans.gif  收藏代码
  1. <?xml version="1.0"?>     
  2. <soap:Envelope     
  3. xmlns:soap="http://www.w3.org/2001/12/soap-envelope"    
  4. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">     
  5.   ...     
  6.   Message information goes here     
  7.   ...     
  8. </soap:Envelope>    
  9.   
  10. <?xml version="1.0"?>  
  11. <soap:Envelope  
  12. xmlns:soap="http://www.w3.org/2001/12/soap-envelope"  
  13. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">  
  14.   ...  
  15.   Message information goes here  
  16.   ...  
  17. </soap:Envelope>  

xmlns:soap 命名空间 
    SOAP 消息必须拥有与命名空间 "http://www.w3.org/2001/12/soap-envelope" 相关联的一个 Envelope 元素。 
    如果使用了不同的命名空间,应用程序会发生错误,并抛弃此消息。 

encodingStyle 属性 
   SOAP 的 encodingStyle 属性用于定义在文档中使用的数据类型。此属性可出现在任何 SOAP 元素中,并会被应用到元素的内容及元素的所有子元素上。SOAP 消息没有默认的编码方式。 
语法 
Java代码  
Java代码 trans.gif  收藏代码
  1. soap:encodingStyle="URI"  
  

soap:encodingStyle="URI" 
实例 
Java代码  
Java代码 trans.gif  收藏代码
  1. <?xml version="1.0"?>     
  2. <soap:Envelope     
  3. xmlns:soap="http://www.w3.org/2001/12/soap-envelope"    
  4. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">     
  5. ...     
  6. Message information goes here     
  7. ...     
  8. </soap:Envelope>    
  9.   
  10. <?xml version="1.0"?>  
  11. <soap:Envelope  
  12. xmlns:soap="http://www.w3.org/2001/12/soap-envelope"  
  13. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">  
  14. ...  
  15. Message information goes here  
  16. ...  
  17. </soap:Envelope>  


SOAP Header 元素 
    可选的 SOAP Header 元素可包含有关 SOAP 消息的应用程序专用信息(比如认证、支付等)。如果 Header 元素被提供,则它必须是 Envelope 元素的第一个子元素。 
     注释:所有 Header 元素的直接子元素必须是合格的命名空间。 
Java代码  
Java代码 trans.gif  收藏代码
  1. <?xml version="1.0"?>     
  2. <soap:Envelope     
  3. xmlns:soap="http://www.w3.org/2001/12/soap-envelope"    
  4. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">     
  5.     
  6. <soap:Header>     
  7. <m:Trans     
  8. xmlns:m="http://www.w3school.com.cn/transaction/"    
  9. soap:mustUnderstand="1">234</m:Trans>     
  10. </soap:Header>     
  11.     
  12. ...     
  13. ...     
  14.     
  15. </soap:Envelope>    
  16.   
  17. <?xml version="1.0"?>  
  18. <soap:Envelope  
  19. xmlns:soap="http://www.w3.org/2001/12/soap-envelope"  
  20. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">  
  21.   
  22. <soap:Header>  
  23. <m:Trans  
  24. xmlns:m="http://www.w3school.com.cn/transaction/"  
  25. soap:mustUnderstand="1">234</m:Trans>  
  26. </soap:Header>  
  27.   
  28. ...  
  29. ...  
  30.   
  31. </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 元素寻址到一个特定的端点。 
语法 
Java代码  
Java代码 trans.gif  收藏代码
  1. soap:actor="URI"   
  

soap:actor="URI" 
实例 
Java代码  
Java代码 trans.gif  收藏代码
  1. <?xml version="1.0"?>     
  2. <soap:Envelope     
  3. xmlns:soap="http://www.w3.org/2001/12/soap-envelope"    
  4. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">     
  5.     
  6. <soap:Header>     
  7. <m:Trans     
  8. xmlns:m="http://www.w3school.com.cn/transaction/"    
  9. soap:actor="http://www.w3school.com.cn/appml/">     
  10. 234    
  11. </m:Trans>     
  12. </soap:Header>     
  13.     
  14. ...     
  15. ...     
  16.     
  17. </soap:Envelope>    
  18.   
  19. <?xml version="1.0"?>  
  20. <soap:Envelope  
  21. xmlns:soap="http://www.w3.org/2001/12/soap-envelope"  
  22. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">  
  23.   
  24. <soap:Header>  
  25. <m:Trans  
  26. xmlns:m="http://www.w3school.com.cn/transaction/"  
  27. soap:actor="http://www.w3school.com.cn/appml/">  
  28. 234  
  29. </m:Trans>  
  30. </soap:Header>  
  31.   
  32. ...  
  33. ...  
  34.   
  35. </soap:Envelope>  

mustUnderstand 属性 
    SOAP 的 mustUnderstand 属性可用于标识标题项对于要对其进行处理的接收者来说是强制的还是可选的。 
    假如您向 Header 元素的某个子元素添加了 "mustUnderstand="1",则它可指示处理此头部的接收者必须认可此元素。假如此接收者无法认可此元素,则在处理此头部时必须失效。 
语法 
Java代码  
Java代码 trans.gif  收藏代码
  1. soap:mustUnderstand="0|1"   


soap:mustUnderstand="0|1" 
实例 
Java代码  
Java代码 trans.gif  收藏代码
  1. <?xml version="1.0"?>     
  2. <soap:Envelope     
  3. xmlns:soap="http://www.w3.org/2001/12/soap-envelope"    
  4. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">     
  5.     
  6. <soap:Header>     
  7. <m:Trans     
  8. xmlns:m="http://www.w3school.com.cn/transaction/"    
  9. soap:mustUnderstand="1">     
  10. 234    
  11. </m:Trans>     
  12. </soap:Header>     
  13.     
  14. ...     
  15. ...     
  16.     
  17. </soap:Envelope>    
  18.   
  19. <?xml version="1.0"?>  
  20. <soap:Envelope  
  21. xmlns:soap="http://www.w3.org/2001/12/soap-envelope"  
  22. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">  
  23.   
  24. <soap:Header>  
  25. <m:Trans  
  26. xmlns:m="http://www.w3school.com.cn/transaction/"  
  27. soap:mustUnderstand="1">  
  28. 234  
  29. </m:Trans>  
  30. </soap:Header>  
  31.   
  32. ...  
  33. ...  
  34.   
  35. </soap:Envelope>  

encodingStyle 属性 
    SOAP 的 encodingStyle 属性在上一节中已解释过了。 

SOAP Body 元素 
    必需的 SOAP Body 元素可包含打算传送到消息最终端点的实际 SOAP 消息。 
    SOAP Body 元素的直接子元素可以是合格的命名空间。SOAP 在默认的命名空间中("http://www.w3.org/2001/12/soap-envelope")定义了 Body 元素内部的一个元素。即 SOAP 的 Fault 元素,用于指示错误消息。 
Java代码  
Java代码 trans.gif  收藏代码
  1. <?xml version="1.0"?>     
  2. <soap:Envelope     
  3. xmlns:soap="http://www.w3.org/2001/12/soap-envelope"    
  4. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">     
  5.     
  6. <soap:Body>     
  7.    <m:GetPrice xmlns:m="http://www.w3school.com.cn/prices">     
  8.       <m:Item>Apples</m:Item>     
  9.    </m:GetPrice>     
  10. </soap:Body>     
  11.     
  12. </soap:Envelope>    
  13.   
  14. <?xml version="1.0"?>  
  15. <soap:Envelope  
  16. xmlns:soap="http://www.w3.org/2001/12/soap-envelope"  
  17. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">  
  18.   
  19. <soap:Body>  
  20.    <m:GetPrice xmlns:m="http://www.w3school.com.cn/prices">  
  21.       <m:Item>Apples</m:Item>  
  22.    </m:GetPrice>  
  23. </soap:Body>  
  24.   
  25. </soap:Envelope>  

   上面的例子请求苹果的价格。请注意,上面的 m:GetPrice 和 Item 元素是应用程序专用的元素。它们并不是 SOAP 标准的一部分。 
    而一个 SOAP 响应应该类似这样: 
Java代码  
Java代码 trans.gif  收藏代码
  1. <?xml version="1.0"?>     
  2. <soap:Envelope     
  3. xmlns:soap="http://www.w3.org/2001/12/soap-envelope"    
  4. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">     
  5.     
  6. <soap:Body>     
  7.    <m:GetPriceResponse xmlns:m="http://www.w3school.com.cn/prices">     
  8.       <m:Price>1.90</m:Price>     
  9.    </m:GetPriceResponse>     
  10. </soap:Body>     
  11.     
  12. </soap:Envelope>    
  13.   
  14. <?xml version="1.0"?>  
  15. <soap:Envelope  
  16. xmlns:soap="http://www.w3.org/2001/12/soap-envelope"  
  17. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">  
  18.   
  19. <soap:Body>  
  20.    <m:GetPriceResponse xmlns:m="http://www.w3school.com.cn/prices">  
  21.       <m:Price>1.90</m:Price>  
  22.    </m:GetPriceResponse>  
  23. </soap:Body>  
  24.   
  25. </soap:Envelope>  

SOAP Fault 元素 
    来自 SOAP 消息的错误消息被携带于 Fault 元素内部。 
    如果已提供了 Fault 元素,则它必须是 Body 元素的子元素。在一条 SOAP 消息中,Fault 元素只能出现一次。 
    SOAP 的 Fault 元素用于下列子元素: 
              
子元素        描述           
<faultcode> 供识别故障的代码
<faultstring>可供人阅读的有关故障的说明
<faultactor>有关是谁引发故障的信息    
<detail>    存留涉及 Body 元素的应用程序专用错误信息




SOAP Fault Codes 
    在下面定义的 faultcode 值必须用于描述故障时的 faultcode 元素中: 
 
错误 描述 
VersionMismatchSOAP Envelope 元素的无效命名空间被发现
MustUnderstandHeader 元素的一个直接子元素(带有设置为 "1" 的mustUnderstand 属性)无法被理解。
Client 消息被不正确地构成,或包含了不正确的信息。 
Server 服务器有问题,因此无法处理进行下去。 


HTTP 协议 
    HTTP 在 TCP/IP 之上进行通信。HTTP 客户机使用 TCP 连接到 HTTP 服务器。在建立连接之后,客户机可向服务器发送 HTTP 请求消息: 
Java代码  
Java代码 trans.gif  收藏代码
  1. POST /item HTTP/1.1    
  2. Host: 189.123.345.239    
  3. Content-Type: text/plain     
  4. Content-Length: 200    
  5.   
  6. POST /item HTTP/1.1  
  7. Host: 189.123.345.239  
  8. Content-Type: text/plain  
  9. Content-Length: 200  
  
  随后服务器会处理此请求,然后向客户机发送一个 HTTP 响应。此响应包含了可指示请求状态的状态代码: 
Java代码  
Java代码 trans.gif  收藏代码
  1. 200 OK     
  2. Content-Type: text/plain     
  3. Content-Length: 200    
  4.   
  5. 200 OK  
  6. Content-Type: text/plain  
  7. Content-Length: 200  

  在上面的例子中,服务器返回了一个 200 的状态代码。这是 HTTP 的标准成功代码。 
   假如服务器无法对请求进行解码,它可能会返回类似这样的信息: 
Java代码  
Java代码 trans.gif  收藏代码
  1. 400 Bad Request     
  2. Content-Length: 0    
  3.   
  4. 400 Bad Request  
  5. 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 主体的字符编码(可选) 
语法 
Java代码  
Java代码 trans.gif  收藏代码
  1. Content-Type: MIMEType; charset=character-encoding     

Content-Type: MIMEType; charset=character-encoding 
例子 
Java代码  
Java代码 trans.gif  收藏代码
  1. POST /item HTTP/1.1    
  2. Content-Type: application/soap+xml; charset=utf-8    
  3.   
  4. POST /item HTTP/1.1  
  5. Content-Type: application/soap+xml; charset=utf-8  


Content-Length 
   SOAP 的请求和响应的 Content-Length 头规定请求或响应主体的字节数。 
语法 
Java代码  
Java代码 trans.gif  收藏代码
  1. Content-Length: bytes   


Content-Length: bytes 
例子 
Java代码  
Java代码 trans.gif  收藏代码
  1. POST /item HTTP/1.1    
  2. Content-Type: application/soap+xml; charset=utf-8    
  3. Content-Length: 250    

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 请求: 
Java代码  
Java代码 trans.gif  收藏代码
  1. POST /InStock HTTP/1.1    
  2. Host: www.example.org     
  3. Content-Type: application/soap+xml; charset=utf-8    
  4. Content-Length: nnn     
  5.     
  6. <?xml version="1.0"?>     
  7. <soap:Envelope     
  8. xmlns:soap="http://www.w3.org/2001/12/soap-envelope"    
  9. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">     
  10.     
  11.   <soap:Body xmlns:m="http://www.example.org/stock">     
  12.     <m:GetStockPrice>     
  13.       <m:StockName>IBM</m:StockName>     
  14.     </m:GetStockPrice>     
  15.   </soap:Body>     
  16.        
  17. </soap:Envelope>    
  18.   
  19. POST /InStock HTTP/1.1  
  20. Host: www.example.org  
  21. Content-Type: application/soap+xml; charset=utf-8  
  22. Content-Length: nnn  
  23.   
  24. <?xml version="1.0"?>  
  25. <soap:Envelope  
  26. xmlns:soap="http://www.w3.org/2001/12/soap-envelope"  
  27. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">  
  28.   
  29.   <soap:Body xmlns:m="http://www.example.org/stock">  
  30.     <m:GetStockPrice>  
  31.       <m:StockName>IBM</m:StockName>  
  32.     </m:GetStockPrice>  
  33.   </soap:Body>  
  34.     
  35. </soap:Envelope>  

SOAP 响应: 
Java代码  
Java代码 trans.gif  收藏代码
  1. HTTP/1.1 200 OK     
  2. Content-Type: application/soap+xml; charset=utf-8    
  3. Content-Length: nnn     
  4.     
  5. <?xml version="1.0"?>     
  6. <soap:Envelope     
  7. xmlns:soap="http://www.w3.org/2001/12/soap-envelope"    
  8. soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">     
  9.     
  10.   <soap:Body xmlns:m="http://www.example.org/stock">     
  11.     <m:GetStockPriceResponse>     
  12.       <m:Price>34.5</m:Price>     
  13.     </m:GetStockPriceResponse>     
  14.   </soap:Body>     
  15.        
  16. </soap:Envelope>    

原文:http://yakar.iteye.com/blog/968930

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值