Web Service入門

1. Web Service的定義
目前對Web Service沒有統一的定義,定義一:Web Service是自包含的、模塊化的應用程序,它可以在Web中被描述、發佈、查找以及調用。定義二:Web Service是基於網絡的、分佈式的模塊化組件,它執行特定的任務,遵守具體的技術規范,這些規范使得Web Service能與其他兼任的組件進行操作。定義三:所謂Web Service是指由企業發佈的完成其特別商務需求的在線應用服務,其他公司或應用軟件通過Internet來訪問並使用這項應用服務。筆者比較喜歡維基百科的定義:Web Service是一種面向服務的架構的技術,通過標準的Web協議提供服務,目的是保證不同平臺的應用服務可以互操作。
目前對WebService還沒有絕對全面和準確的定義,但是一般Web Service通常包括:
SOAP
一個基於XML的可擴展消息信封格式,需同時綁定一個傳輸協議。這個協議通常是HTTP或HTTPS、SMTP、XMPP。
WSDL
一個XML格式文檔,用以描述服務端口訪問方式和使用協議的細節。通常用來輔助生成服務器和客戶端代碼及配置信息。比如JAVA語言的wsdl2java 工具。
UDDI
一個用來發佈和搜索WEB服務的協議,應用程序可借由此協議在設計或運行時找到目標WEB Service。
 
2. 使用Web Service的方式
遠端過程調用
Web Service提供一個分佈式函數或方法接口供用戶調用,這是一種比較傳統的方式。通常,在WSDL中對RPC接口進行定義。盡管最初的Web Service廣泛采用RPC這種方式部署,但是針對其過於緊密之耦合性的批評聲也絡繹不絕。原因是RPC式的Web Service服務是利用一個簡單的映射,把用戶請求直接轉換為一個特定語言編寫的函數或方法。
面向服務架構
相比RPC式的Web Service,面向服務架構(SOA)得到瞭大部分主要軟件供應商以及業界專傢的支持和肯定。因為SOA方式更加關註如何去連接服務而不是去特地某個實現的細節。
REST式服務
表達性狀態轉移(Representational state transfer,REST)類似於HTTP協議,REST把接口限定在一組HTTP操作中,比如GTP、PUT、DELETE等以供調用,此種服務可以通過WSDL來描述SOAP消息內容,通過HTTP限定動作接口;或者完全在SOAP中對動作進行抽象。
 
3. HelloWorld
筆者將使用Apache Cxf官網的How To示例來實現helloworld和後續的示例,並且筆者將使用maven工具來構建示例項目。關於cxf及maven請參考官網http://cxf.apache.org、http://maven.apache.org。(示例使用maven構建項目pom.xml)
編寫Web Service
HelloWorld.java
 
、、
@WebService
 public interface HelloWorld {
 String sayHi(@WebParam(name=”text”) String text); //這裡的text為輸入參數
 }
HelloWorldImpl.java

package demo.hw.server;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import javax.jws.WebService;
 @WebService(endpointInterface = “demo.hw.server.HelloWorld”, serviceName = “HelloWorld”)
 public class HelloWorldImpl implements HelloWorld {
 public String sayHi(String text) {
 System.out.println(“sayHi called”);
 return “Hello ” + text;
 }
 }
發佈服務
Server.java
 
System.out.println(“Starting Server”);
 HelloWorldImpl implementor = new HelloWorldImpl();
 String address = “http://localhost:9000/helloWorld”; //發佈地址
 Endpoint.publish(address, implementor);
訪問Web Service
Client.java
 
 
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
 factory.getInInterceptors().add(new LoggingInInterceptor());
 factory.getOutInterceptors().add(new LoggingOutInterceptor());
 factory.setServiceClass(HelloWorld.class);
 factory.setAddress(“http://localhost:9000/helloWorld”); //地址為以上發佈的地址
 HelloWorld client = (HelloWorld) factory.create();
 String reply = client.sayHi(“HI”);
 System.out.println(“Server said: ” + reply);
 System.exit(0);
3. XML與JSON
兩者都是Web Service資源表示方式,直白點說,就是Web Service將以兩者之一來請求或者返回結果。它們定義如下:
1. JSON 一種輕量級的數據交換格式,具有良好的可讀性和便於快速編寫的特性。另外,JSON采用的兼容性很高的文本格式。
2. XML 擴展標記語言,用於標記電子文件使其具有結構性的標記語言,可以用來標記數據、定義數據類型,是一種允許用戶對自己的標記語言進行定義的源語言。XML、非常適合Web傳輸,其提供瞭一種統一方法來描述和交換獨立於應用程序或供應商的結構化數據。
 
XML與JSON優缺點比較:
1. 可讀性 兩者不相上下,JSON格式{property1:value1,property2:value2,…},XML格式value1value2。在描述上,XML要優於JSON。
2. 可擴展性 這點XML可以做的,JSON也可以。
3. 數據大小 這點JSON要優於XML,但是差別不是太大。
4. 使用范圍 XML目前被業界廣泛采用,而javascript語言對JSON支持要比XML優越。
5. 性能 經測試,JSON的解析速度幾乎是XML解析的10倍。
 
4. CXF與Spring框架集成
假定使用Maven來構建項目,pom.xml
編寫Web Service
HelloWorld.java
 
package demo.spring.service;
 import javax.jws.WebService;
 @WebService public interface HelloWorld {
 String sayHi(String text);
 }
接口實現類HelloWorldImpl.java
 
package demo.spring.service;
 import javax.jws.WebService;
 @WebService(endpointInterface = “demo.spring.service.HelloWorld”)
 public class HelloWorldImpl implements HelloWorld {
 public String sayHi(String text) {
 System.out.println(“sayHi called”);
 return “Hello ” + text;
 }
 }
在項目的WEB-INF目錄下新建一個”cxf-servlet.xml”文件,內容:
另外還需要設置Servlet。一般,Web項目中都會有一個Web.xml文件,我們需要添加Spring ContextLoaderLister元素。當Web容器啟動時,將由Spring ContextLoaderLister來啟動Srping,並且加載配置文件。這些配置文件是通過context-param元素來定義的。

 
contextConfigLocation WEB-INF/beans.xml //配置文件
org.springframework.web.context.ContextLoaderListener
最後在上述的beans.xml在創建客戶端。
這裡可以選擇將”helloClient” 註入到Srping bean中,或者采用手動的方式從Spring application context中查找:
 
ApplicationContext context = …; // your Spring ApplicationContext
 HellWorld client = (HelloWorld) context.getBean(“helloClient”);
 

發佈留言