当前位置: 代码迷 >> Web前端 >> Webservice-[零]
  详细解决方案

Webservice-[零]

热度:196   发布时间:2012-09-23 10:28:10.0
Webservice-[0]

http://www.ibm.com/developerworks/webservices/library/ws-whichwsdl/?Which style of WSDL should I use?

Web Service概述

Web Service的定义
W3C组织对其的定义如下,它是一个软件系统,为了支持跨网络的机器间相互操作交互而设计。Web Service服务通常被定义为一组模块化的API,它们可以通过网络进行调用,来执行远程系统的请求服务。

这里我们从一个程序员的视角来观察web service。在传统的程序编码中,存在这各种的函数方法调用。通常,我们知道一个程序模块M中的方法A,向其发出调用请求,并传入A方法需要的参数P,方法A执行完毕后,返回处理结果R。这种函数或方法调用通常发生在同一台机器上的同一程序语言环境下。现在的我们需要一种能够在不同计算机间的不同语言编写的应用程序系统中,通过网络通讯实现函数和方法调用的能力,而Web service正是应这种需求而诞生的。

最普遍的一种说法就是,Web Service = SOAP + HTTP + WSDL。其中,SOAP Simple Object Access Protocol)协议是web service的主体,它通过HTTP或者SMTP等应用层协议进行通讯,自身使用XML文件来描述程序的函数方法和参数信息,从而完成不同主机的异构系统间的计算服务处理。这里的WSDL(Web Services Description Language)web 服务描述语言也是一个XML文档,它通过HTTP向公众发布,公告客户端程序关于某个具体的 Web service服务的URL信息、方法的命名,参数,返回值等。
下面,我们先来熟悉一下SOAP协议,看看它是如何描述程序中的函数方法、参数及结果对象的。

SOAP协议简介

什么是SOAP
SOAP 指简单对象访问协议,它是一种基于XML的消息通讯格式,用于网络上,不同平台,不同语言的应用程序间的通讯。可自定义,易于扩展。一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素:
? Envelope 元素,标识XML 文档一条 SOAP 消息
? Header 元素,包含头部信息的XML标签
? Body 元素,包含所有的调用和响应的主体信息的标签
? Fault 元素,错误信息标签。

以上的元素都在 SOAP的命名空间http://www.w3.org/2001/12/soap-envelope中声明;
SOAP的语法规则
? SOAP 消息必须用 XML 来编码
? SOAP 消息必须使用 SOAP Envelope 命名空间
? SOAP 消息必须使用 SOAP Encoding 命名空间
? SOAP 消息不能包含 DTD 引用
? SOAP 消息不能包含 XML 处理指令

SOAP 消息的基本结构

Java代码 复制代码
  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. <soap:Header> ??
  6. ??... ??
  7. ??... ??
  8. </soap:Header> ??
  9. <soap:Body> ??
  10. ??... ??
  11. ??... ??
  12. ??<soap:Fault> ??
  13. ????... ??
  14. ????... ??
  15. ??</soap:Fault> ??
  16. </soap:Body> ??
  17. </soap:Envelope>??
<? 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 元素
Envelope 元素是 SOAP 消息的根元素。它指明 XML 文档是一个SOAP 消息。它的属性 xmlns:soap的值必须是http://www.w3.org/2001/12/soap-envelope。
? encodingStyle 属性,语法:soap:encodingStyle="URI"
encodingStyle 属性用于定义文档中使用的数据类型。此属性可出现在任何 SOAP 元素中,并会被应用到元素的内容及元素的所有子元素上。

Java代码 复制代码
  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>??
<? 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 元素

  • actor 属性,语法soap:actor="URI"


通过沿着消息路径经过不同的端点,SOAP 消息可从某个发送者传播到某个接收者。并非 SOAP 消息的所有部分均打算传送到 SOAP 消息的最终端点,不过,另一个方面,也许打算传送给消息路径上的一个或多个端点。SOAP 的 actor 属性可被用于将 Header 元素寻址到一个特定的端点。

  • mustUnderstand 属性 ,语法soap:mustUnderstand="0|1"


SOAP 的 mustUnderstand 属性可用于标识标题项对于要对其进行处理的接收者来说是强制的还是可选的。假如您向 Header 元素的某个子元素添加了 "mustUnderstand="1",则要求处理此头部的接收者必须认可此元素。

Java代码 复制代码
  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. <soap:Header> ??
  6. <m:Trans ??
  7. xmlns:m= "http://www.jsoso.net/transaction/" ? ??
  8. soap:mustUnderstand= "1" ? ??
  9. soap:actor="http: //www.w3schools.com/appml/?“??>234</m:Trans> ??
  10. </soap:Header> ??
  11. ... ??
  12. ... ??
  13. </soap:Envelope>??
<? 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.jsoso.net/transaction/" 
soap:mustUnderstand="1" 
soap:actor="http://www.w3schools.com/appml/ “  >234</m:Trans>
</soap:Header>
...
...
</soap:Envelope>



SOAP Body 元素
必需的 SOAP Body 元素可包含打算传送到消息最终端点的实际 SOAP 消息。Body元素中既可以包含SOAP定义的命名空间中的元素,如Fault,也可以是用户的应用程序自定义的元素。以下是一个用户定义的请求:

Java代码 复制代码
  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. <soap:Body> ??
  6. ???<m:GetPrice?xmlns:m= "http://www.jsoso.net/prices" > ??
  7. ??????<m:Item>Apples</m:Item> ??
  8. ???</m:GetPrice> ??
  9. </soap:Body> ??
  10. </soap:Envelope>??
<? 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.jsoso.net/prices">
      <m:Item>Apples</m:Item>
   </m:GetPrice>
</soap:Body>
</soap:Envelope>


上面的例子请求苹果的价格。请注意,上面的 m:GetPrice 和 Item 元素是应用程序专用的元素。它们并不是 SOAP 标准的一部分。而对应的 SOAP 响应应该类似这样:

Java代码 复制代码
  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. <soap:Body> ??
  6. ???<m:GetPriceResponse?xmlns:m= "http://www.jsoso.net/prices" > ??
  7. ??????<m:Price> 1.90 </m:Price> ??
  8. ???</m:GetPriceResponse> ??
  9. </soap:Body> ??
  10. </soap:Envelope>??
<?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.jsoso.net/prices">
      <m:Price>1.90</m:Price>
   </m:GetPriceResponse>
</soap:Body>
</soap:Envelope>



SOAP Fault 元素
Fault 元素表示 SOAP的错误消息。它必须是 Body 元素的子元素,且在一条 SOAP 消息中,Fault 元素只能出现一次。Fault 元素拥有下列子元素:

常用的SOAP Fault Codes


HTTP协议中的SOAP 实例
下面的例子中,一个 GetStockPrice 请求被发送到了服务器。此请求有一个 StockName 参数,而在响应中则会返回一个 Price 参数。此功能的命名空间被定义在此地址中: "http://www.jsoso.net/stock"

  • SOAP 请求:(注意HTTP的Head属性)

?

Java代码 复制代码
  1. POST?/InStock?HTTP/ 1.1 ??
  2. Host:?www.jsoso.net ??
  3. Content-Type:?application/soap+xml;?charset=utf- 8 ??
  4. Content-Length:?XXX ??
  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. ??<soap:Body?xmlns:m= "http://www.jsoso.net/stock" > ??
  11. ????<m:GetStockPrice> ??
  12. ??????<m:StockName>IBM</m:StockName> ??
  13. ????</m:GetStockPrice> ??
  14. ??</soap:Body>?? ??
  15. </soap:Envelope>??
POST /InStock HTTP/1.1
Host: www.jsoso.net
Content-Type: application/soap+xml; charset=utf-8
Content-Length: XXX

<? 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.jsoso.net/stock">
    <m:GetStockPrice>
      <m:StockName>IBM</m:StockName>
    </m:GetStockPrice>
  </soap:Body>  
</soap:Envelope>

?

  • SOAP 响应:(注意HTTP的Head属性)

?

Java代码 复制代码
  1. HTTP/ 1.1 ? 200 ?OK ??
  2. Content-Type:?application/soap+xml;?charset=utf- 8 ??
  3. Content-Length:?XXX ??
  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. ??<soap:Body?xmlns:m= "http://www.jsoso.net/stock" > ??
  10. ????<m:GetStockPriceResponse> ??
  11. ??????<m:Price> 34.5 </m:Price> ??
  12. ????</m:GetStockPriceResponse> ??
  13. ??</soap:Body>?? ??
  14. </soap:Envelope>??
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: XXX

<? 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.jsoso.net/stock">
    <m:GetStockPriceResponse>
      <m:Price>34.5</m:Price>
    </m:GetStockPriceResponse>
  </soap:Body>  
</soap:Envelope>



HTTP协议中的SOAP RPC工作流程

  相关解决方案