基於SOAP協議的WEB服務研究

摘 要(Abstract)     Web 服務是局域網和因特網上能夠支持機器與機器之間互操作的軟件系統。它有一個用WSDL描述的接口,其它系統可以使用SOAP消息以接口所描述的方式與之交互。SOAP協議是Web服務賴以生存的基礎。本文詳細介紹了SOAP協議,並介紹了Java Web服務的一種標準結構。然後介紹了基於SOAP協議的 WEB服務的一個具體實現過程。最後介紹了Web服務的未來發展。
A Web Service is a software system designed to support interoperable machine-to-machine interaction over Intranet and Internet. It has an interface described in WSDL. Other systems interact with the Web Service in a manner prescribed by its description using SOAP-messages.Web Service depends on SOAP.This paper elaborates on SOAP,and it also introduces a standard structure of Java Web service.Then it uses an example to illustrate how to establish a simple SOAP based Web Service.Finally it introduces the development of Web Service in the future.
關鍵詞(Keywords)      WEB服務   SOAP   Java
Web Service       SOAP       Java

1  引言
1.1 Web服務的定義及特性
    近年來,隨着企業內部、企業與企業之間各種應用系統互相通信和互操作性需求的增長,Web Service得到了飛速的發展。Web服務的目標是實現這樣的分佈式環境:在此環境中各個組織內部及各組織之間任意數量的應用程序或應用程序組件能夠以與平臺無關和語言無關的方式無縫交互。
按W3C組織的定義,Web服務是通過統一資源標識URI(Uniform Resource Identifiers)標識的軟件系統,它的共用接口和綁定用XML來定義和描述。Web Service的定義能夠被其它的軟件系統發現,這些系統然後可以通過Internet協議傳遞基於XML的消息,這樣就可以用Web Service 所定義的方式與其交互。

    Web服務使我們能夠對因特網或網絡上的一個對象進行遠程調用RPC(Remote Procedure Call)。Web服務使用中性平臺標準(例如HTTP和XML),這使我們可以對客戶完全隱藏執行任務的細節,客戶只需要知道這個服務的URL或方法調用使用的數據類型,而不需要知道該任務到底是一個在Linux上運行的還是一個在Windows上運行的用Java編程的ASP.NET服務。

1.2 Web服務核心技術
    Web服務是若干技術的集合,其中SOAP、WSDL、和UDDI是其技術體系的核心。WSDL是Web服務的描述語言,它類似於CORBA的IDL用以描述Web服務的交互消息格式、端口類型以及傳輸協議的綁定。Web服務使用UDDI作爲目錄機制,服務發佈者可以將服務信息註冊到UDDI,從而方便服務使用者進行服務查找。SOAP提供一個標準的包裝結構用以在多種標準Internet技術上(包括SMTP、HTTP和FTP)傳輸XML文檔。它還定義了用XML傳送非XML RPC調用的編碼和綁定標準,SOAP爲RPC提供了一個簡單的結構:文檔交換。採用標準傳輸機制後,異構的客戶和服務器能一下子可互操作。.NET用戶能調用SOAP暴露的EJB,Java客戶能夠調用暴露的.NET組件。

2  SOAP技術
2.1 SOAP的定義及特性
    SOAP(Simple Object Access Protocol)即簡單對象訪問協議,它是一個輕型分佈式計算協議,允許在一個分散、分佈的環境交換結構化的信息。SOAP規範定義了在分佈式系統中傳送消息的框架和支持遠程過程調用和響應的慣例。但是,SOAP並沒有詳細說明語義,只是提供框架。

    SOAP並不是第一個分佈式計算協議,但它是第一個受到業界前所未有的支持,對它的支持來自所有主要的軟、硬件銷售商,IBM、Microsoft以及Sun公司等都支持它。這種情況對於其它分佈式計算協議(例如:CORBA、RMI和DCOM)從未發生過。
SOAP的部分特性如下:
(1) 高度互操作性
SOAP是用基於文本的XML協議與分佈式系統通信,而不是用其它分佈式計算協議(例如CORBA、RMI和DCOM)使用二進制格式。這使得SOAP具有跨硬件平臺、操作系統、編程語言和網絡硬件平臺的高度互操作性。
(2) SOAP並沒有排除與其它Internet協議的綁定
雖然SOAP規範1.2中只定義了與SOAP與HTTP的綁定,但SOAP並沒有排除與其它Internet協議(例如SMTP和FTP等)綁定。
(3) 擴展容易
SOAP很容易通過XML擴展,使得它於企業級特性(例如交易、安全性等)相結合。

2.2 SOAP消息
    下面是一個用SOAP消息表示的網上定購從武漢到上海飛機票的例子:
<?xml version='1.0' ?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope ">
<env:Header>
<m:reservation xmlns:m=http://travelcompany.example.org/reservation
env:role=http://www.w3.org/2003/05/soap-envelope/role/next
  env:mustUnderstand="true">
<m:reference>uuid:093a2da1-q345-739r-ba5d-pqff98fe8j7d</m:reference
<m:dateAndTime>2003-10-29T13:20:00.000-05:00</m:dateAndTime>
</m:reservation>
<n:passenger xmlns:n=http://mycompany.example.com/employees
env:role=http://www.w3.org/2003/05/soap-envelope/role/next
  env:mustUnderstand="true">
  <n:name>Tom</n:name>
</n:passenger>
</env:Header>
<env:Body>
    xmlns:p="http://travelcompany.example.org/reservation/travel ">
     <p:departure>
     <p:departing>Wuhan</p:departing>
     <p:arriving>Shanghai</p:arriving>
    <p:departureDate>2003-11-1</p:departureDate>
   <p:departureTime>late afternoon</p:departureTime>
     <p:seatPreference>aisle</p:seatPreference>
     </p:departure>
</env:Body>
</env:Envelope>
    從上例中可以看到SOAP消息是以SOAP Envelope爲根元素,內含2個子元素:SOAP Header和SOAP Body。這2個子元素的內容是由應用定義的,而不由SOAP規範所決定。

    SOAP Header是可選的,也可以沒有。SOAP Header在SOAP消息中提供了一種傳遞信息的途徑,但它傳遞的信息不是應用程序的有效載荷。這些信息可以是與要處理的消息相關聯的信息或指示,可以由SOAP消息傳遞路徑中的中間節點處理。本例中,SOAP頭中的reservation塊提供了訂票的序號和時間標誌,passenger塊提供訂票人的身份。由於這兩個塊的mustUnderstand屬性都爲真,所以它們必須被處理。

    SOAP Body是強制性的,是SOAP消息必須要有的元素,它包含了SOAP消息的主要內容,由最終接收SOAP消息的節點處理。SOAP Body是應用的有效載荷,可以包含應用數據、RPC方法和參數以及SOAP錯誤。本例中它只含有一個子元素:departure。它包含了最終接收 SOAP消息的節點要處理的信息。

2.3 SOAP消息處理模式
    SOAP提供一個分散的處理模式,假定SOAP消息從消息的初始發送者到最終接收者之間要通過許多SOAP中節點或不通過中節點。SOAP消息處理模式描述了SOAP節點在收到消息時採取的行爲。SOAP節點根據“role”屬性、“mustUnderstand”屬性以及“relay”來決定相應的動作。

    SOAP節點對SOAP消息的進一步處理依賴於“role”屬性。在處理SOAP消息時,一個SOAP節點可以扮演一個或更多的角色(role),三種標準的角色定義如下:
·http://www.w3.org/2003/05/soap-envelope/role/none (簡稱“none”)
·http://www.w3.org/2003/05/soap-envelope/role/next (簡稱“next”)
·http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver (簡稱“ultimateReceiver”)
表1總結了在不同的節點情況可適用的標準角色:
表1  不同的SOAP節點可適用的標準角色
 
    爲了保證SOAP節點不會忽略對應用很重要的SOAP頭塊(SOAP header blocks),SOAP頭塊提供了額外可選的屬性:“mustUnderstand”,如果該屬性爲真的話,意味着目標SOAP節點必須按那個塊的說明處理塊。表2總結了對於SOAP頭塊的處理行爲:
表2    mustUnderstand屬性與節點的處理行爲


    SOAP版本1.2爲SOAP消息頭塊定義了另外一個可選屬性:“relay”屬性。注意到如果一個SOAP頭塊被處理了,按照SOAP消息的處理規則,它必須從SOAP消息中刪除。對於沒有被處理的塊,缺省的行爲是在消息傳遞之前刪除它。這主要是因爲安全方面考慮,但是有時候,當應用的設計者引入一個通過SOAP消息頭塊展示的新特性,任何SOAP消息傳遞路徑上的中間節點可能都要遇到這個塊,這樣一個塊可能爲那些可以理解它的中節點所利用,與此相反,另外一些中節點卻忽略它並傳遞它。當一個SOAP頭塊的“relay”屬性爲“true”時,容許不處理它的中節點傳遞它,使別的中間節點有機會處理它。

2.4 SOAP綁定
    SOAP消息可以通過多種協議在應用之間交換。使用一個協議在SOAP節點間傳遞SOAP消息的規範就是SOAP綁定。一個綁定規範描述了它所提供的特性,有些特性是自然由SOAP所綁定的協議提供的,不能由綁定協議提供的特性通過使用SOAP頭在SOAP信封內實現。

    HTTP是一個著名的連接模型和信息交換模式。有兩種方式傳遞SOAP消息:1、用HTTP POST方法。2、用HTTP GET方法。

    在HTTP上的SOAP請求與SOAP響應非常類似,一般是一個HTTP頭在加上一個SOAP消息。下面是一個SOAP HTTP請求的例子:
POST /Reservations HTTP/1.1
Host: travelcompany.example.org
Content-Type: application/soap+xml; charset="utf-8"
Content-Length: nnnn
<?xml version='1.0' ?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope ">
         ……
</env:Envelope>
SOAP還可以與EMAIL綁定,SOAP EMAIL消息由一個EMAIL頭,加上一個SOAP消息組成,下面是一個下SOAP EMAIL請求的例子:
From: [email protected]
To: [email protected]
Subject: Travel to LA
Date: Thu, 30 Oct 2003 13:20:00
<m:dateAndTime>2003-10-30T13:20:00.000-05:00</m:dateAndTime>
Content-Type: application/soap+xml
<?xml version='1.0' ?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope ">
         ……
</env:Envelope>
3  SOAP服務的標準結構
    WEB服務的架構主要有Sun公司的J2EE和Microsoft的.NET,兩種平臺各有各的優點,從目前來看,J2EE更成熟。J2EE基於Java技術的,圖1是Java中SOAP服務的標準結構:


圖1    Java中SOAP標準結構


    一個客戶機應用程序用SOAP在HTTP上的遠程過程調用請求,SOAP運行時間(例如Apache SOAP)環境收到這個RPC請求後立刻把該請求傳遞給含有該請求方法的那個Java對象。在這個結構中,Java對象可以訪問本地的或遠程的資源。

4  SOAP服務實例
    介紹一個採用SOAP技術的工作簡歷檔案服務,允許人們提交和檢索簡歷。

4.1 運行環境
    需要Apache SOAP服務器,它提供了一個服務器端的構件用來部署、管理和運行基於SOAP服務,還提供了客戶端的API來調用SOAP服務。還需要Apache Tomcat 4.0服務器,以及以下文件:xerces.jar(XML語法分析)、mail.jar(郵件處理API)、 activation.jar(Javabeans激活框架)。這些文件在Sun和Apache的網站上可以免費下載。它們和SOAP.jar應該放在 Tomcat服務器的lib路徑下,並把SOAP.war放到Tomcat服務器的Webapps目錄下。

4.2 開發SOAP服務
    服務實現類—實現一個服務的標準Java類。當Apache SOAP運行時間從SOAP客戶機收到服務請求時,標準Java提供者就會調用這種類。

    我們的實現類爲JobResumeService,含有submit(Resume resume)和retrieve(string uid)方法,實現分別存儲和檢索簡歷的功能。此外,還需要一個Resume類,用以在Apache SOAP客戶機和Apache SOAP服務器之間交換簡歷數據。Resume數據是用戶自定義類型,需要用Apache SOAP運行時間註冊新的類型映射。由於編寫的Resume類符合JavaBean規範,org.opache.encoding.soapenc.BeanSerializer類就可以處理這個類的串行化。uid是簡歷的編號。

4.3 開發SOAP客戶機
    用戶用一個HTML表單輸入簡歷,表單含有多個輸入簡歷信息的字段。把表單填好並提交後,就由一個叫做SubmitServlet的服務小程序進行處理。SubmitServlet程序中調用SOAP服務的代碼如下:
    Call call = new Call();
    call.setSOAPMappingRegistry(smr);
    call.setTargetObjectURI("urn:JobResumeService");
    call.setMethodName("submit");
call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
Vector params = new Vector();
params.addElement(new Parameter("resume", Resume.class,resume,null));
call.setParams(params);//指定參數
Response resp = null;
try {    URL url = new URL(RPCROUTER);
         resp = call.invoke(url, "");}
catch (SOAPException e){…}

    設置SOAP請求用org.apache.soap.rpc.call對象來完成,上面代碼中用setSOAPMappingRegistry()方法設置對SOAPMappingRegistry對象的引用,所以CALL對象知道將要發送和接收的類型是什麼。如果只是使用預定義的那些類型就不用調用這個方法。不過因爲在例子中用的是用戶定義的類型(Resume),所以必須調用該方法。用setTargetObjectURI()方法指定服務名,在該例子中的服務名是urn:JobResumeService;用setMethodName()方法指定想執行的方法名submit;用 setEncodingStyleURI()方法指定在SOAP消息編碼時應當使用的編碼方式;由於submit()需要一個參數,參數必須加到CALL 對象調用請求;最後用invoke()方法把SOAP請求送到SOAP服務器。

    客戶端對簡歷的查詢使用RetrieveServlet服務小程序來實現,它的SOAP調用與SubmitServlet類似。

4.4 部署運行服務
    首先要部署我們的JobResumeService類,部署描述文件JobResumeDD.xml描述了JobResumeService類的編碼類型和方法。可以用兩種方式部署服務:
(1) 用命令行部署
java org.apache.soap.server.ServiceManagerClient  http://localhost:8080/soap/
servlet/rpcrouter deploy JobResumeDD.xml
(2) 服務的註冊
用基於Web的工具,把瀏覽器指向http://localhost:8080/soap/admin ,單擊deploy按鈕,按規範填寫表單,即可完成服務的註冊。
(3) 運行服務
先啓動Tomcat服務器,把瀏覽器指向http://localhost:8080/jobresume 就可以提交和查詢簡歷。

5  結束語 
    基於SOAP的Web服務通過Internet協議和XML格式的SOAP來實現網絡服務的訪問,具有跨平臺、跨語言的優點。但是沒有任何技術可以解決一切問題,SOAP技術也不例外,它不會取代其它分佈式計算技術(例如RMI、CORBA及DCOM)。當前,Web服務的若干技術SOAP、WSDL以及 UDDI都在不斷髮展和完善中,基於SOAP的Web服務技術必將在應用系統整合方面發揮越來越重要的作用。

參考文獻
[1] 盧 剛,高春蓉. Java Web服務編程指南[M]. 北京:電子工業出版社,2002.
[2] 魏海洋,於曉菲. Java SOAP編程指南[M]. 北京:電子工業出版社,2002.
[3] 毛世傑,劉紹華. Java Web服務[M]. 北京:中國電力出版社,2003.
[4] W3C. SOAP Version 1.2 Part 0: Primer. http://www.w3.org/TR/2003/REC-soap12-part0-20030624 . June 2003.
[5] W3C. Web Services Architecture. http://www.w3.org/TR/ws-arch/ . August 2003.

作者簡介
譚思雲(1963-)  男  武漢理工大學自動化學院副教授 主要研究方向:計算機系統集成及故障診斷。

發佈了24 篇原創文章 · 獲贊 10 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章