應用Apache Axis進行Web Service開發

轉自(http://tscjsj.blog.51cto.com/412451/84813)html

1、概述

SOAP原意爲Simple Object Access Protocol(簡單對象訪問協議),是一個用於分佈式環境的、輕量級的、基於XML進行信息交換的通訊協議(SOAP is an XML based protocol used to exchange information throughout a distributed environment)。
如下是w3c網站上的定義:
SOAP Version 1.2 (SOAP) is a lightweight protocol intended for exchanging structured information in a decentralized, distributed environment. It uses XML technologies to define an extensible messaging framework providing a message construct that can be exchanged over a variety of underlying protocols. The framework has been designed to be independent of any particular programming model and other implementation specific semantics.
能夠認爲SOAP是XML-RPC的高級版本,兩者基於相同的原理:利用HTTP + XML封裝進行RPC調用。
SOAP最初由MS發起研究,用以解決MTS/COM資源消耗大,不夠輕巧等問題,後逐漸被IBM等巨頭接納並加入研究,現已提交W3C,成爲Web Service應用傳輸標準。對於輕量級、可擴展Web Service應用協議的需求促成了SOAP的普遍應用,也間接促進了XML的流行。關於相關歷史的更多信息,見 [url]http://www.microsoft.com/china/MSDN/library/WebServices/WebServices/SOAPSpecificationIndexPage.mspx[/url][url]http://www-128.ibm.com/developerworks/cn/webservices/ws-ref1/index.html[/url]

2、SOAP數據包結構解析

SOAP的消息被稱爲一個SOAP Envelope,包括SOAP Header和SOAP Body。其中,SOAP Header能夠方便的插入各類其它消息來擴充Web Service的功能,好比Security(採用證書訪問Web Service),SOAP Body則是具體的消息正文,也就是Marshall後的信息。
SOAP調用的時候,也就是向一個URL(好比 [url]http://api.google.com/search/beta2[/url])發送HTTP Post報文(根據SOAP規範,HTTP Get報文也可被支持),調用方法的名字在HTTP Request Header SOAP-Action中給出,接下來就是SOAP Envelope了。服務端接到請求,執行計算,將返回結果Marshall成XML,用HTTP返回給客戶端。
如下是一個典型的SOAP數據包:
 
< s:Envelope  xmlns:s ="http://www.w3.org/2003/05/soap-envelope" > 

       < s:Header > 

             < m:transaction  xmlns:m ="soap-transaction"  s:mustUnderstand ="true" > 

                   < transactionID >1234 </ transactionID > 

             </ m:transaction > 

       </ s:Header > 

       < s:Body > 

             < n:purchaseOrder  xmlns:n ="urn:OrderService" > 

                   < from > 

                         < person >Christopher Robin </ person > 

                         < dept >Accounting </ dept > 

                   </ from > 

                   < to > 

                         < person >Pooh Bear </ person > 

                         < dept >Honey </ dept > 

                   </ to > 

                   < order > 

                         < quantity >1 </ quantity > 

                         < item >Pooh Stick </ item > 

                   </ order > 

             </ n:purchaseOrder > 

       </ s:Body > 

</ s:Envelope > 
 
其中包含了一些SOAP規範定義的標籤,同時也能夠包含一些具體應用相關的標籤。
Note:
若是你是一個普通的應用開發者,以上介紹已經足夠了,由於相應的SOAP應用平臺會負責完成相應SOAP數據包的打包和解析;若是你是一個SOAP應用平臺的實現者,關於SOAP基礎理論的更多介紹可參考《Programming Web Services with SOAP》一書或SOAP Specification([url]http://www.w3.org/TR/soap12-part0/[/url])。

3、安裝Apache Axis

Apache Axis自己也是一個Web Project,它內建了對SOAP的編碼、解析,併爲Client提供了一些使用SOAP Service的API,同時,爲Web Service的發佈提供管理,並對Client提交的處理請求做出響應。對於基於Axis的應用而言,咱們能夠將注意力徹底放在具體Service和Client的設計上,而無需考慮中間的傳輸過程(對於Client而言,還須要使用一些Axis提供的訪問SOAP服務的特定API),這一點是與XML RPC不一樣的地方。
Apache Axis能夠從 [url]http://ws.apache.org/axis/[/url]下載,當前的最新版本是1.4。
安裝Axis的過程很簡單:
一、解壓Axis到任意目錄下;
二、拷貝Axis目錄下的webapps/axis目錄到%TOMCAT_HOME%/webapps下;
三、爲了便於編譯和測試程序,添加環境變量:
AXIS_HOME      Axis的解壓目錄
AXIS_LIB      %AXIS_HOME%/lib
AXISCLASSPATH      %AXIS_LIB%\axis.jar;%AXIS_LIB%\commons-discovery-0.2.jar;%AXIS_LIB%\commons-logging-1.0.4.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%\saaj.jar;%AXIS_LIB%\log4j-1.2.8.jar
完成上述工做後,啓動Tomcat,並用IE打開: [url]http://localhost:8080/axis/[/url],點擊其中的Validation、List兩個連接,若是沒有報告任何錯誤,則說明Axis安裝成功。
關於Apache Axis安裝的更多信息能夠參考官方文檔: [url]http://ws.apache.org/axis/java/install.pdf[/url]

4、舉例

有了上面對SOAP的基本理解,下面咱們體驗一下Apache Axis 1.4提供的SOAP服務。
如下面EchoService爲例:
 
public  class EchoService {  

       public String echoString(String name) {  

             return name;  
      }  

}
其對應的 Client程序以下所示:
 
package demo.soap; 
import org.apache.axis.client.Call; 
import org.apache.axis.client.Service; 
import javax.xml.namespace.QName; 

public  class EchoClient { 

       public  static  void main(String [] args) { 

             try { 

                  String endpoint =  "http://localhost:8080/axis/EchoService.jws"; 

                  // Create Service and Call object to set up a SOAP RPC 

                  Service service = new Service(); 

                  Call call = (Call)service.createCall(); 

                  // Tells which service and method will be invoked 

                  call.setTargetEndpointAddress(new java.net.URL(endpoint)); 

                  call.setOperationName(new QName("echoString")); 

                  // Invoke method with required parameters 

                  String ret = (String)call.invoke(new Object[] { "Hello!" }); 

                  System.out.println("Sent 'Hello!', got '" + ret + "'"); 

            } catch (Exception e) { 

                  System.err.println(e.toString()); 

            } 

      } 



對於Client程序而言,對Axis Service進行訪問的基本方法是:
一、建立Service及Call對象;
二、設置Call對象屬性,如訪問點(標明將訪問哪一個Axis Service)及方法名等;
三、傳入參數數組,調用Call對象的invoke方法。
可以使用以下命令編譯EchoClient.java:
javac -cp %AXISCLASSPATH% EchoClient.java
在Axis中,存在兩種發佈SOAP Service的方法。
方法一:
將源程序EchoService.java拷貝到%TOMCAT_HOME%/webapps/axis下,並將其後綴改成.jws便可。
第一種方法很是的簡單,可是第一種發佈方法存在幾個重要的限制:
一、不能指定package;
二、須要有Service的源碼;
所以經常不能知足咱們的須要。
方法二:
第二種發佈Axis Service的方法需經過配置來完成。
如下面的HelloService爲例(與前面的EchoService基本沒有什麼區別,但其中使用了package):
 
package demo.soap; 

public  class HelloService { 

       public String sayHello() { 

             return  "Hello World!"
      } 

 
要發佈上面的Service,需編寫以下的配置文件:
 
< deployment  xmlns ="http://xml.apache.org/axis/wsdd/"  xmlns:java ="http://xml.apache.org/axis/wsdd/providers/java" > 

       < service  name ="HelloService"  provider ="java:RPC" > 

             < parameter  name ="className"  value ="demo.soap.HelloService" /> 

             < parameter  name ="allowedMethods"  value ="*" /> 

       </ service > 

</ deployment > 
 
將上述內容保存爲%TOMCAT_HOME%\webapps\axis\WEB-INF\deploy.txt,並在其所在目錄下執行:
java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.txt
生成server-config.wsdd文件,打開該文件看一下,能夠看到HelloService的相關信息已被添加到該文件,此外,還包括一些默認的配置信息以及AdminService、Version兩個基礎服務。
如下是HelloService的Client程序的相關代碼:
 
package demo.soap; 
import org.apache.axis.client.Call; 
import org.apache.axis.client.Service; 

public  class HelloClient { 

       public  static  void main(String [] args)  throws Exception { 

            String endpoint =  "http://localhost:" + "8080" + "/axis/services/HelloService"; // Attention: A little difference 

            Service service = new Service(); 

            Call call = (Call)service.createCall(); 

            call.setTargetEndpointAddress(new java.net.URL(endpoint)); 

            call.setOperationName("sayHello"); 

            String res = (String)call.invoke(new Object[] {}); 

            System.out.println(res); 

      } 


 
與前面的EchoClient的區別僅在於訪問點稍有不一樣。
發佈後如何刪除對應的Service呢?要刪除上面發佈的HelloService服務,只需在%TOMCAT_HOME%\webapps\axis\WEB-INF目錄下添加以下的undeploy.txt描述文件,其內容以下:
 
< undeployment  xmlns ="http://xml.apache.org/axis/wsdd/" > 

       < service  name ="HelloService" /> 

</ undeployment > 
而後執行:
java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.txt
以更新server-config.wsdd文件。
將看到前面已發佈的對應的Service已被刪除。
若是之後還要發佈新的Service,你能夠選擇直接更新上面產生的server-config.wsdd文件,或者重複上面的步驟。
相關文章
相關標籤/搜索