WebService的優缺點

來源:文萃谷 3.06W

Web service是一個平台的獨立,低耦合的,自包含的、基於可編程的web的應用程序,可使用開放的XML(標準通用標記語言下的一個子集)標準來描述、發佈、發現、協調和配置這些應用程序,用於開發分佈式的互操作的應用程序。

WebService的優缺點

  1. 什麼是WebService?

對這個問題,我們至少有兩種答案。從表面上看,WebService 就是一個應用程序,它向外界暴露出一個能夠通過Web進行調用的API。這就是説,你能夠用編程的方法通過Web來調用這個應用程序。我們把調用這個 WebService 的應用程序叫做客户。

例如,你想創建一個WebService ,它的作用是返回當前的天氣情況。那麼你可以建立一個ASP頁面,它接受郵政編碼作為查詢字符串,然後返回一個由逗號隔開的字符串,包含了當前的氣温和天氣。要調用這個ASP頁面,客户端需要發送下面的這個HTTP GET請求: 返回的數據就應該是這樣:

21,晴

這個ASP頁面就應該可以算作是WebService了。因為它基於HTTP GET請求,暴露出了一個可以通過Web調用的API。當然WebService還有更多的東西。

下面是對WebService更精確的解釋:WebService是建立可互操作的分佈式應用程序的新平台。作為一個Windows程序員,你可能已經用 COM或DCOM建立過基於組件的分佈式應用程序。COM是一個非常好的組件技術,但是我們也很容易舉出COM並不能滿足要求的情況。 WebService平台是一套標準,它定義了應用程序如何在Web上實現互操作性。你可以用任何你喜歡的語言,在任何你喜歡的平台上寫 WebService ,只要我們可以通過WebService標準對這些服務進行查詢和訪問。

  2. WebService的優點:

跨防火牆的通信

如果應用程序有成千上萬的用户,而且分佈在世界各地,那麼客户端和服務器之間的通信將是一個棘手的問題。因為客户端和服務器之間通常會有防火牆或者代理服務器。在這種情況下,使用DCOM就不是那麼簡單,通常也不便於把客户端程序發佈到數量如此龐大的每一個用户手中。傳統的做法是,選擇用瀏覽器作為客户端,寫下一大堆ASP頁面,把應用程序的中間層暴露給最終用户。這樣做的結果是開發難度大,程序很難維護。

舉個例子,在應用程序里加入一個新頁面,必須先建立好用户界面(Web頁面),並在這個頁面後面,包含相應商業邏輯的中間層組件,還要再建立至少一個 ASP頁面,用來接受用户輸入的信息,調用中間層組件,把結果格式化為HTML形式,最後還要把“結果頁”送回瀏覽器。要是客户端代碼不再如此依賴於 HTML表單,客户端的編程就簡單多了。

如果中間層組件換成WebService的話,就可以從用户界面直接調用中間層組件,從而省掉建立ASP頁面的那一步。要調用 WebService,可以直接使用MicrosoftSOAPToolkit或這樣的SOAP客户端,也可以使用自己開發的SOAP客户端,然後把它和應用程序連接起來。不僅縮短了開發週期,還減少了代碼複雜度,並能夠增強應用程序的可維護性。同時,應用程序也不再需要在每次調用中間層組件時,都跳轉到相應的“結果頁”。

從大多數人的經驗來看,在一個用户界面和中間層有較多交互的應用程序中,使用WebService這種結構,可以節省花在用户界面編程上20% 的開發時間。另外,這樣一個由WebService組成的中間層,完全可以在應用程序集成或其它場合下重用。最後,通過WebService把應用程序的邏輯和數據“暴露”出來,還可以讓其它平台上的客户重用這些應用程序。

應用程序集成

企業級的應用程序開發者都知道,企業裏經常都要把用不同語言寫成的、在不同平台上運行的各種程序集成起來,而這種集成將花費很大的開發力量。應用程序經常需要從運行在IBM主機上的程序中獲取數據;或者把數據發送到主機或UNIX應用程序中去。即使在同一個平台上,不同軟件廠商生產的各種軟件也常常需要集成起來。通過WebService,應用程序可以用標準的方法把功能和數據“暴露”出來,供其它應用程序使用。

例如,有一個訂單登錄程序,用於登錄從客户來的新訂單,包括客户信息、發貨地址、數量、價格和付款方式等內容;還有一個訂單執行程序,用於實際貨物發送的管理。這兩個程序來自不同軟件廠商。一份新訂單進來之後,訂單登錄程序需要通知訂單執行程序發送貨物。通過在訂單執行程序上面增加一層 WebService,訂單執行程序可以把“AddOrder”函數“暴露”出來。這樣,每當有新訂單到來時,訂單登錄程序就可以調用這個函數來發送貨物了。

B2B的集成

用WebService集成應用程序,可以使公司內部的商務處理更加自動化。但當交易跨越供應商和客户、突破公司的`界限時會怎麼樣呢?跨公司的商務交易集成通常叫做B2B集成。

WebService是B2B集成成功的關鍵。通過WebService,公司可以把關鍵的商務應用“暴露”給指定的供應商和客户。例如,把電子下單系統和電子發票系統“暴露”出來,客户就可以以電子的方式發送訂單,供應商則可以以電子的方式發送原料採購發票。當然,這並不是一個新的概念,EDI(電子文檔交換)早就是這樣了。但是,WebService的實現要比EDI簡單得多,而且WebService運行在Internet上,在世界任何地方都可輕易實現,其運行成本就相對較低。不過,WebService並不像EDI那樣,是文檔交換或B2B集成的完整解決方案。WebService只是 B2B集成的一個關鍵部分,還需要許多其它的部分才能實現集成。

用WebService來實現B2B集成的最大好處在於可以輕易實現互操作性。只要把商務邏輯“暴露”出來,成為WebService,就可以讓任何指定的合作伙伴調用這些商務邏輯,而不管他們的系統在什麼平台上運行,使用什麼開發語言。這樣就大大減少了花在B2B集成上的時間和成本,讓許多原本無法承受EDI的中小企業也能實現B2B集成。

軟件和數據重用

軟件重用是一個很大的主題,重用的形式很多,重用的程度有大有小。最基本的形式是源代碼模塊或者類一級的重用,另一種形式是二進制形式的組件重用。

  3. WebService的缺點

單機應用程序

目前,企業和個人還使用着很多桌面應用程序。其中一些只需要與本機上的其它程序通信。在這種情況下,最好就不要用WebService,只要用本地的 API就可以了。COM非常適合於在這種情況下工作,因為它既小又快。運行在同一台服務器上的服務器軟件也是這樣。最好直接用COM或其它本地的API來進行應用程序間的調用。當然WebService也能用在這些場合,但那樣不僅消耗太大,而且不會帶來任何好處。

局域網的同構應用程序

在許多應用中,所有的程序都是用VB或VC開發的,都在Windows平台下使用COM,都運行在同一個局域網上。例如,有兩個服務器應用程序需要相互通信,或者有一個Win32或WinForm的客户程序要連接局域網上另一個服務器的程序。在這些程序裏,使用DCOM會比SOAP/HTTP有效得多。與此相類似,如果一個程序要連接到局域網上的另一個程序,應該使用emoting。有趣的是,在emoting 中,也可以指定使用SOAP/HTTP來進行WebService調用。不過最好還是直接通過TCP進行RPC調用,那樣會有效得多。

  WebService應用

1. JDK6增加了對WS的支持

下面是WebService的一個簡單的服務應用

Java代碼

import .*;

import .*;

import .*;

@WebService(targetNamespace="http://localhost:7070/Ebay")

@SOAPBinding(style = )

public class HelloService

{

public static void main(String args)

{

ish("http://localhost:7070/Ebay",new HelloService());

}

@WebMethod

public void sayHello()

{

tln("hello");

}

}

2. Axis安裝配置

安裝JDK;

安裝並配置Tomcat;

從官方的網站http://ws.apache.org/axis下載最新的Axis項目打包文件,並將webapps下axis目錄拷貝到Tomcat的webapps目錄下;

驗證Axis的安裝;

瀏覽所發佈的服務。 3. 服務器端開發

即時發佈

使用即時發佈首先需要一個實現服務功能的Java源文件,將其擴展名改為(Java Web Service的縮寫),然後將該文件放到Tomcat下面的webappsaxis目錄下即可。但是JWS的web服務發佈是一個很簡單的Web服務發佈方式,在頁面中你不能使用包,而且由於代碼是在運行期被編譯的,所以在部署之後,你也很難找到錯誤所在。

定製發佈

① 編寫要發佈為服務的java類

② 編譯生成的class文件應該放在Tomcat下的webappsaxisWEB-INFclasses下面

③ 編寫 文件描述服務的名稱,入口等信息

④ 切換到命令航下,執行

java nClient –p 8085 4. 調用web服務

DLL動態接口調用方式(Dynamic Invocation Interface)

Java代碼

public static void main(String args) {

try {

String endpoint =

"http://localhost:8080/axis/services/test1";

//實例化一個服務對象service

Service service = new Service();

//創建一個空的調用對象Call,設置Call的操作名稱,目標地址,傳入參數等等

//執行調用後即可得到返回的結果

Call call = (Call) teCall();

argetEndpointAddress( new (endpoint) );

perationName(new QName("", "add3") );

// Call to addParameter/setReturnType as described in

//arameter("testParam",

// _STRING,

// );

//eturnType(_STRING);

Integer ret = (Integer) ke( new Object { 1,3 } );

tln( ret);

} catch (Exception e) {

tln(ring());

}

}

動態代理方式(Dynamic Proxy)

動態代理需要一個本地的接口作為代理

Java代碼

public interface ITestDynameicProxy extends Remote {

public String getMessage() throws RemoteException;

}

public static void main(String args) throws Exception {

String wsdlUrl = "http://localhost:8080/axis/test/

String nameSpaceUri = "";

String serviceName = "Test1Service";

String portName = "Test1";

ServiceFactory serviceFactory = nstance();

Service service = teService(

new URL(wsdlUrl), new QName(nameSpaceUri,serviceName));

ITestDynameicProxy proxy = (ITestDynameicProxy)ort(

new QName(nameSpaceUri,portName),s);

tln(essage());

}

通過輸入wsdl地址,命名空間地址和服務名,用服務工廠創建出一個服務實例,再通過設置端口名得到一個服務類型的服務代理對象,通過該代理,就可以直接訪問web服務了。

靜態方式(Stubs)

① 按常規方式發佈一個WebService

② 得到wsdl文件

* 通過web頁面直接另存為

* 通過Java2WSDL工具類生成

(java 2WSDL -o -l http://localhost:8080/axis/services/demo -n )

③ 利用WSDL2Java工具類生成客户端調用代碼

(java 2Java -p client)

④ 在生成的代碼基礎上,進行客户端的調用

Java代碼

public static void main(String args) throws ServiceException, RemoteException {

DemoServiceLocator demoService = new DemoServiceLocator();

Demo demo = emo();

tln(essage());

}

熱門標籤