① forest調用webservice
用java實現web services必須遵循兩個規范,他們分別是:
JSR 101:用於基於XML的RPC ,Remote Procere Call、 的Java API 、Java
API for XML based RPC, JAX-RPC,
JSR 109:實現企業Web服務。Implementing Enterprise Web services。兩個規范提供了廠商的實現的一致性和互操作性需求。
JAX-RPC——Java到XML和XML到Java映射API
JAX-RPC為基於XML的遠程過程調用。Remote Procere Call、 RPC,和Java應用程序編程介面 、Java Application Programming Interface。 API, 、
WSDL到Java和Java到WSDL映射,例如、將WSDL埠類型映射到Java服
務端點介面 ,Java Service Endpoint Interface、 SEI。 。
XML數據類型到Java數據類型和Java數據類型到XML數據類型映射。包括簡
單類型、復雜類型和數組。
除了XML映射之外, JAX-RPC還定義了伺服器端編程模型和API。 AX-RPC 1. 1根據Web 服務互操作性組織、Web Services Interoperability organization、 WS-I。基本概要版本1.0 、Basic Profile version 1.0,添加了互操作性需求。
JSR 109——J2EE環境的API
JSR 109指定了Java 2 Enterprise Edition ,J2EE、環境的Web服務編程模型和體系結構。 JSR 109構建在SOAP 1. 1和WSDL 1. 1的基礎上、它涵蓋了J2EE環境中JAX-RPC 的使用, 圖2, 。它還定義了J2EE應用程序伺服器中的部署模型。 JSR 109的客戶端編程模型符合JAX-RPC。
JAX-RPC 1. 1和JSR 109是J2EE 1.4的組成部分。
1/7頁
在這里我不準備描述用java如何實現服務端,僅描述如何用java作為客戶端如何調用web services。
獲取客戶端服務
Java客戶端有兩種獲取方式、一種是基於容器管理的、一種不是基於容器管理的。基於容器管理的、可以是不同類型的J2EE容器管理的客戶機,
應用程序客戶機容器客戶機
Web容器客戶機。 JavaBean或Servlet
EJB容器客戶機、 EJB
他們通過jndi查找服務。一般是兩個步驟:
1,實例化本地JND I上下文。
2、在此上下文中對Web服務進行JND I查找。
Context ic = new InitialContext() ;
Service service = (Service) ctx. lookup("java:comp/env/service/HelloService") ;然後可以使用獲得的服務介面 。Service Interface,來獲取靜態存根、動態代理或DII Call對象,來實現我下面描述的三種調用方式。
不是基於容器管理的、就是在本地通過java程序直接調用服務的,服務查找是通過JAX-RPC ServiceFactory進行的、 JAX-RPC ServiceFactory是創建服務訪問點的工廠,可以如下進行使用獲取服務。javax.xml.rpc.Service service =
ServiceFactory.newInstance() .createService(. . . ) ;
我在下面描述的客戶端獲取方式都是基於不是容器管理的。java調用webservices
用java作為客戶端調用webservices主要有三種方式,下面描述三種調用方式。
1.DLL 、Dynamic Invocation Interface,調用
復雜度最高。靈活性最強的調用方式
通過自己創建Call對象完成調用,此方法的步驟如下,
2/7頁
1. 獲取一個JAX-RPC Service 。
2. 使用JAX-RPC Service的createCall ()方法實例化JAX-RPC Call 。
3. 使用它的setter方法來配置您的Call實例。
4. 使用JAX-RPC Call的調用方法來調用Web服務的操作。
String namespace = "http://Hello.com";
String portName = "Hello";
QName portQN = new QName"(namespace, "portName) ;
String operationName = getGreeting ;
Call call = service.createCall () ;call. setPortTypeName(portQN) ;call. setOperationName(new QName(namespace, operatio"n"Name) ) ;call. setProperty(Call.ENCODINGSTYLE_URI_PROPERTY, ) ;call. setProperty(Ca"ll.OPER"ATION_STYLE_PROPERTY, "wrapped") ;call.addParameter( param1 , <xsd:string>,ParameterMode. IN) ;call. setReturnType(<xsd:string>) ;
Object[] inParams = new Object[] {"Jane"} ;
String ret = (String) call. invoke(inParams) ;
使用DII Call介面的優勢在於,客戶機可以調用遠程過程而無需知道開發時的WSDL URI或Web服務操作的簽名。這樣當Web服務的細節改變時、很容易對代碼進行修改。使用DII客戶機,不需要像動態代理或靜態存根的情形那樣由從WSDL到Java的映射工具。Emitter,生成運行時類。然而,如果您知道您想要調用的 Web服務不可能更改,就應該使用動態代理。 因為配置Call實例可能很復雜。
我以調用一個axis的webservices為例說明DLL如何調用。
編寫服務端程序Hello package com. lion. service public class Hello {public String sayHello(String name)
{return "hello "+name;
}
}
將上面的程序發布成一個web服務。在web-info\server-config.wsdd文件添加下列描述,<service name="Hel"lo" provide"r="java":RPC">
<parameter name= className value= com. lion. service .Hello"/>
<parameter name="allowedMethods" value=" sayHello "/>
</service>
客戶端調用程序如下TestHelloClient. java,import org.apache.axis.client.Call ;
3/7頁
import org.apache.axis.client.Service;import javax.xml.namespace.QName;import javax.xml.rpc.ServiceException;import java.net.MalformedURLException;import java.rmi.RemoteException;public class TestHelloClient{public static void main(String[] args) {try {
String endpoint = "http://localhost:8080/axis/Hello ";
Service service = new Service() ;
Call call = null;call = (Call) service.createCall () ;call. setTargetEndpointAddress(new java.net.URL(endpoint) ) ;
//為Call設置服務的位置call. setOperationName( 「sayHello」 ) ;
String res = (String)" call. invoke(new"Object[] {"lion"} ) ;
System.out.println( return value is + res) ;
} catch (Exception ex) {ex.printStackTrace() ;
}
}
}
2.使用動態代理,Dynamic Proxy、調用
復雜度中等、靈活性中等的調用方式
您可以使用代理從JAX-RPC Service中調用Web服務的操作。代理是實現SEI (服務端點介面 Service Endpoint Interface)的Java類。獲得代理使用的是JAX-RPC Service 的getPort()方法,它接受您想要調用的Web服務的埠的名稱,存在於WSDL文檔中。以及代理實現的SEI。它之所以稱為動態是因為該代理是在運行時創建的。動態代理客戶機的步驟如下、
1. 獲取一個JAX-RPC Service 。
2. 使用JAX-RPC Service的getPort()方法來獲得一個代理以調用Web服務的操
作。
String namespace = "http://Hello.com";
String portName = "Hello";
QName portQN = new QName(namespace, portName) ;
4/7頁
Hello myProxy = service.getPort(portQN, Hello.class) ;
System.out.println(myProxy.getGreeting("Jane") ) ;
這是所有您為了使用動態代理方法調用Web服務而需要編寫的代碼。使用這種方法的優勢在於您可以編寫可移植的、廠商無關的代碼。然而、您需要知道開發時的WSDL URL、並且需要在運行之前根據WSDL文檔運行您的從WSDL到Java的映射工具。如果您沒有這方面的信息,或者WSDL URL很可能改變、那麼您應該改為使用DII方法。
仍以上面發布的hello服務為例子。下面是動態代理的調用代碼。
編寫客戶端代理介面
//這里聲明的方法一定要和服務端程序的方法名稱和參數相同。最好類名也一樣//而且必須繼承java.rmi.Remote介面public interface HelloClientInterface extends java.rmi.Remote {public String sayHello (String name) throws java.rmi.RemoteException;}
編寫並執行客戶端程序TestHelloClient. java import javax.xml.rpc.Service;import javax.xml.rpc.ServiceFactory;import java.net.URL;import javax.xml.namespace.QName;public class TestHelloClient {public static void main(String[] args) {try
{
String wsdlUrl = "http://localhost:8080/axis/Hello?wsdl ";//wsdl描述
String nameSpaceUri = "http://localhost:8080/axis/HelloClient ";//wsdl描述裡面的服務命名空間
String serviceName = "HelloService";// wsdl描述裡面發布的服務名稱
String portName = "Hello";//wsdl描述裡面面發布的服務裡面的port名稱
ServiceFactory serviceFactory = ServiceFactory.newInstance() ;
Service afService = serviceFactory.createService(new URL(wsdlUrl) ,new QName(nameSpaceUri, serviceName) ) ;
HelloClientInterface proxy = (HelloClientInterface)afService.getPort(new QName(nameSpaceUr"i, portName) , Hel"loClientInterface."clas"s) ;
System.out.println( return value is +proxy. sayHello( lion ) ) ;
}catch(Exception ex)
{ex.printStackTrace() ;
}
② ASP.NET入門教程 12.2.1調用Web服務
當運行第一個示例並使用簡單的Web服務時 通過在瀏覽器中鍵入URL來實現這一點 然而 在鍵入URL時 也指定了正在使用的協議(例如 // 這一點非常重要 因為Web服務能夠在多數協議上工作 從SMTP(Simple Mail Transport Protocol 簡單郵件傳輸協議)到SHTTP(Secure HTTP 安全的Http} 然而 使用HTTP之外的其他協議超出了本書的介紹范圍 並且只使用HTTP協議就可以完成大量工作 但不應該認為限制為只使用這種方法
ASP NET使用HTTP請求/響應系統向後和向前傳遞信息 任何信息都作為請求的一部分發送到Web服務 並且伺服器將作為響應的一部分返回來自於Web服務的任何內容 最常見的情況是 可以通過HTML表單和標準的HTML控制項將值傳送到Web服務
發送到Web服務的請求包含如下信息
Web服務的URL
它是HTTP請求的實際情況
發送的信息量
希望從Web服務返回的文檔類型
有關客戶端的信息
請求的日期
希望發送到Web服務的參數
瀏覽器從表單中收集信息 並且將其包裝在准備傳送的文檔中 這個過程稱為串列化
lishixin/Article/program/net/201311/15054
③ 如何實現webservice的非同步調用
對非同步調用的理解:
說白了非同步調用其實就是調用者線程和執行被調用過程的線程並行執行。
實現WEB服務方法非同步調用有不同方法都可以實現,下面給你舉三個例子:
第一種方法是:使用回調
使用這種方式來進行WEB服務方法的非同步調用關鍵是在啟動非同步調用時傳入一個代理實例作為調用結束時的回調方法。這樣用以回調的方法調用結束非同步調用的方法獲得非同步調用的結果。若調用方要跟非同步調用同步,則需要在啟動非同步調用時傳入一個同步對象[作為最後一個參數],然後在回調方法中通過IAsyncResult的AsyncState成員獲得該對象。
舉一個例子:
假如有下面一個WEB服務方法
[webmethod]
public string GetName(string name)
{return name;}
/*****************客戶端調用**************************
class Client
{
localhost1.Serivice service=new localhost1.Service();
public void GetResults(IAsyncResult ar)
{
MannualResetEvent ent;
ent=(MannualResetEvent)ar.AsyncState;
string ret=service.EndGetName(ar);
Console.WriteLine("the result is:"+ret);
ent.Set();
}
public void CallWithBack()
{
string name="kim";
AsyncCallBack callBack;
callBack=new AsyncCallBack(GetResults);
MannualResetEvent ent=MannualResetEvent(false);
service.BeginGetName(name,callBack,ent);
//做其他的事情
ent.WaitOne();
}
static void Main(string[] ars)
{
CallWithBack();
}
}
第二種方法使用輪詢
輪詢就是不斷檢查非同步調用啟動後獲得的IasyncResult變數的IsCompleted屬性,以等待非同步調用結束。而一般在判斷非同步調用還未結束時,調用Thread類的靜態方法Sleep(0)迫使當前線程由運行狀態轉入就緒狀態。
如:
WEB服務方法還是以上面的例子為例:
客戶端實現:
Class Client
{
localhost1.Serivice service=new localhost1.Service();
public void CallWithQuery()
{
string name="kim";
IasyncResult ar;
ar=service.BeginGetName(name,null,null);
while(!ar.IsCompleted)
{
//做其他事情
Console.WritleLine("Watting....");
Tread.Sleep(0);
}
string ret;
ret=service.EndGetName(ar);
Console.WriteLine("the result is:"+ret);
}
static void Main(string[] ars)
{
CallWithQuery();
}
}
第三種方法是:開始調用,結束調用
這種方式在啟動非同步調用後用結束非同步調用的方式獲取結果,如果非同步調用沒有結束,當前線成被阻塞。
如:
WEB服務方法還是以上面的例子為例:
客戶端實現:
Class Client
{
localhost1.Serivice service=new localhost1.Service();
public void CallWithEnd()
{
string name="kim";
IasyncResult ar=service.BeginGetName(name,null,null);
string ret=service.EndGetName(ar);
Console.WriteLine("the result is:"+ret);
}
static void Main(string[] ars)
{
CallWithEnd();
}
}
④ 怎麼調用使用eclipse bpel組合的web服務
依次點擊「File->New->Other」,在Wizards里輸入「bpel」,在出現的工程類型中選擇「BPEL Project」,點擊「Next」,在彈出的對話框里輸入工程名稱「BPELFibonacci」,如名稱,本文調用的Web Service的功能是生成Fibonacci數列,伺服器選擇「ODE」
然後點擊「Next」,最後擊點「Finish」,一個BPEL工程創建完畢。
第二步,創建BPEL Process
在Eclipse的Package Explorer中,右擊BPELFibonacci下的「bpelContent」,在彈出的菜單里選擇「New->Other」,在彈出對話框的Wizards文本框里輸入「bpel」,然後選擇列表中的「BPEL Process File」,點擊「Next」。
Process Name輸入「BPELFibonacci」,Namespace輸入http://bpel.sklse.org,然後點擊「Next」
更改Template為同步,即下拉列表選擇「Synchronous BPEL Process」,把Service Address改為http://localhost:8080/ode/processes/BPELFibonacci,其它不變,點擊「Next」按鈕,然後點擊「Finish」按鈕,系統為我們創建了Process文件,並自動打開了流程編輯器。
第三步,將服務的WSDL文件加入工程
不論你用什麼方式,請將服務的WSDL文件加入到工程的bpelContent文件夾下,請確保WSDL文件中的地址是可用的,也就是說,可通過瀏覽器訪問到這個WSDL文件。本例中,使用的WSDL文件是FibonacciPort.wsdl。
第四步,編輯Process
不論初始的流程是什麼,通過拖拽「Actions」,拖動兩個assign和一個invoke,
第四步A,編輯invoke,創建夥伴鏈接
流程的核心是執行服務,夥伴鏈接實際上是指定此流程與哪個服務綁定,被綁定的服務將會被執行。一個服務有輸入和輸出。
此流程只包含最基本的三個部分:輸入、執行和輸出,分別對應「receiveInput和assignInputToSOAPRequest」、「invokeFibonacci」以及「replyOutput和assignOutputToResult」。
選中「invokeFibonacci」,在Eclipse下方打開「Properties」標簽頁(如果沒有,請點擊Eclipse菜單「Window->Show View->Properties」),
點擊「Details」,在右邊的面板中點擊「Partner Link」文本框後面的下拉三角,選擇「Create Global Partner Link」,打開創建鏈接對話框,首先輸入夥伴鏈接名稱「BPELFibonacciPL」:
點擊「OK」按鈕,然後選擇鏈接到的Web Service,也就是Fibonacci服務:
選擇來源和過濾條件為「From Project」和「Show Port Types」,在「Matches」里選擇「FibonacciDelegate」,「FibonacciDelegate」的內容會自動出現在「Partner Link Type Structure」下,在這里也選擇「FibonacciDelegate」,然後點擊「OK」按鈕,進入下一步,輸入夥伴鏈接類型名稱:
輸入「BPELFibonacciPLT」,名稱是任意的,然後點擊「Next」按鈕,輸入角色名稱「BPELFibonacciRole」,選中下面的Web服務「FibonacciDelegate」,點擊「Next」,彈出的對話框里什麼都不輸入,再點擊一次「Finish」,完成了夥伴鏈接的創建。
⑤ 怎麼調用webservice服務
寫一個WINDOWS服務定期調用webservice中的方法。
1、先建一個WebService(ASP.NET Web 服務應用程序)
2、建這個WebService的虛擬目錄
3、執行生成一個文件
{
C:\Program Files\Microsoft Visual Studio 8\VC>wsdl /language:C# /out:c:\myProxyClass.cs http://hostServer:88/ImportData.asmx?WSDL
這個工具(方法)是針對一個webservice生成一個能動態調用的類
language:C#-----C#語言輸出
c:\myProxyClass.cs-----這個是生成的文件存在本地的文件名和路徑
http://hostServer:88/ImportData.asmx-----是虛擬目錄運行時的地址
}
4、創建一個windows服務程序(新建項目->左側選windows->右側選windows服務),然後把生成的文件引入到windows服務的程序中
5、寫調用事件(BeginImportUFData)
6、完成後編譯生成一下,這時就會在此windows服務程序的bin文件夾下生成一個exe文件(如:MyNewService.exe
)
7、按以下方式安裝
安裝:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe 絕對路徑\MyNewService.exe
卸載:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe -u 絕對路徑\MyNewService.exe
例如:(用dos命令窗口執行)
安裝:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe E:\chengxu\MyNewService\MyNewService\bin\Debug\MyNewService.exe
【然後顯示:正在安裝程序集,最後顯示:「提交」階段成功完成】
卸載:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe -u E:\chengxu\MyNewService\MyNewService\bin\Debug\MyNewService.exe
【最後提示:卸載完成】
啟動、停止服務是window操作,找到管理-->服務 操作
⑥ Web應用技巧(一)如何調用WebService
從表面上看,Web service 就是一個應用程序,它向外界暴露出一個能夠通過Web進行調用的API。這就是說,你能夠用編程的方法通過Web來調用這個應用程序。 對Web service 更精確的解釋: Web services是建立可互操作的分布式應用程序的新平台。作為一個Windows程序員,你可能已經用COM或DCOM建立過基於組件的分布式應用程序。COM是一個非常好的組件技術,但是我們也很容易舉出COM並不能滿足要求的情況。Web service平台是一套標准,它定義了應用程序如何在Web上實現互操作性。你可以用任何你喜歡的語言,在任何你喜歡的平台上寫Web service ,只要我們可以通過Web service標准對這些服務進行查詢和訪問。 不管你的Web service是用什麼工具,什麼語言寫出來的,只要你用SOAP協議通過HTTP來調用它,總體結構都一致。通常,你用你自己喜歡的語言(如VB 6或者VB.NET)來構建你的Web service,然後用SOAP Toolkit或者.NET的內建支持來把它暴露給Web客戶。於是,任何語言,任何平台上的客戶都可以閱讀其WSDL文檔,以調用這個Web service。客戶根據WSDL描述文檔,會生成一個SOAP請求消息。Web service都是放在Web伺服器 (如IIS) 後面的,客戶生成的SOAP請求會被嵌入在一個HTTP POST請求中,發送到Web伺服器來。Web伺服器再把這些請求轉發給Web service請求處理器。對VB 6程序來說,Web service請求處理器是一個與SOAP Toolkit組件協同工作的ASP頁面或ISAPI extension。而對VB.NET程序來說,Web service請求處理器則是一個.NET Framework自帶的ISAPI extension。請求處理器的作用在於,解析收到的SOAP請求,調用Web service,然後再生成相應的SOAP應答。Web伺服器得到SOAP應答後,會再通過HTTP應答的方式把它送回到客戶端。 2. 基本概念SOAPWeb service建好以後,其他人就會去調用它。簡單對象訪問協議(SOAP)提供了標準的遠程過程調用( RPC)方法來調用Web service。SOAP規范定義了SOAP消息的格式,以及怎樣通過HTTP協議來使用SOAP。SOAP也是基於XML和XSD的,XML是SOAP的數據編碼方式。客戶端和服務端之間的方法調用請求和結果返回值都放在這些消息里。 XML和XSD可擴展的標記語言(XML)是Web service平台中表示數據的基本格式。除了易於建立和易於分析外,XML主要的優點在於它既是平台無關的,又是廠商無關的。無關性是比技術優越性更重要的。XML解決了數據表示的問題,但它沒有定義一套標準的數據類型,更沒有說怎麼去擴展這套數據類型。例如,整形數到底代表什麼?16位,32位,還是 64位?這些細節對實現互操作性都是很重要的。W3C制定的XML Schema(XSD)就是專門解決這個問題的一套標准。它定義了一套標準的數據類型,並給出了一種語言來擴展這套數據類型。Web service平台就是用XSD來作為其數據類型系統的。當用某種語言(如VB.NET或C#)來構造一個Web service時,為了符合Web service標准,所有使用的數據類型都必須被轉換為XSD類型。 WSDL(Web Services Description Language) 用於描述服務端所提供服務的XML格式。WSDL文件里,描述了服務端提供的服務,提供的調用方法,以及調用時所要遵循的格式,比如調用參數和返回值的格式等等。WSDL 很像COM編程里的IDL(Interface Description Language),是伺服器與客戶端之間的契約,雙方必須按契約嚴格行事才能實現功能。 WSML(Web Services Meta Language) 用於描述WSDL里提供的方法與實現該方法的COM對象之間的映射關系。該文件是Microsoft的實現中特有的,不是SOAP標準的一部分。一般情況下,該文件只在服務端存在。 3.Webservice的技術特點 長項一: 跨防火牆的通信 如果應用程序有成千上萬的用戶,而且分布在世界各地,那麼客戶端和伺服器之間的通信將是一個棘手的問題。因為客戶端和伺服器之間通常會有防火牆或者代理伺服器。在這種情況下,使用DCOM就不是那麼簡單,通常也不便於把客戶端程序發布到數量如此龐大的每一個用戶手中。傳統的做法是,選擇用瀏覽器作為客戶端,寫下一大堆ASP頁面,把應用程序的中間層暴露給最終用戶。這樣做的結果是開發難度大,程序很難維護。 舉個例子,在應用程序里加入一個新頁面,必須先建立好用戶界面(Web頁面),並在這個頁面後面,包含相應商業邏輯的中間層組件,還要再建立至少一個ASP頁面,用來接受用戶輸入的信息,調用中間層組件,把結果格式化為HTML形式,最後還要把「結果頁」送回瀏覽器。要是客戶端代碼不再如此依賴於HTML表單,客戶端的編程就簡單多了。 如果中間層組件換成Web Service的話,就可以從用戶界面直接調用中間層組件,從而省掉建立ASP頁面的那一步。要調用Web Service,可以直接使用Microsoft SOAP Toolkit或.NET這樣的SOAP客戶端,也可以使用自己開發的SOAP客戶端,然後把它和應用程序連接起來。不僅縮短了開發周期,還減少了代碼復雜度,並能夠增強應用程序的可維護性。同時,應用程序也不再需要在每次調用中間層組件時,都跳轉到相應的「結果頁」。 從經驗來看,在一個用戶界面和中間層有較多交互的應用程序中,使用Web Service這種結構,可以節省花在用戶界面編程上20%的開發時間。另外,這樣一個由Web Service組成的中間層,完全可以在應用程序集成或其它場合下重用。最後,通過Web Service把應用程序的邏輯和數據「暴露」出來,還可以讓其它平台上的客戶重用這些應用程序。 長項二: 應用程序集成 企業級的應用程序開發者都知道,企業里經常都要把用不同語言寫成的、在不同平台上運行的各種程序集成起來,而這種集成將花費很大的開發力量。應用程序經常需要從運行在IBM主機上的程序中獲取數據;或者把數據發送到主機或UNIX應用程序中去。即使在同一個平台上,不同軟體廠商生產的各種軟體也常常需要集成起來。通過Web Service,應用程序可以用標準的方法把功能和數據「暴露」出來,供其它應用程序使用。 例如,有一個訂單登錄程序,用於登錄從客戶來的新訂單,包括客戶信息、發貨地址、數量、價格和付款方式等內容;還有一個訂單執行程序,用於實際貨物發送的管理。這兩個程序來自不同軟體廠商。一份新訂單進來之後,訂單登錄程序需要通知訂單執行程序發送貨物。通過在訂單執行程序上面增加一層Web Service,訂單執行程序可以把「Add Order」函數「暴露」出來。這樣,每當有新訂單到來時,訂單登錄程序就可以調用這個函數來發送貨物了。 Web Service是B2B集成成功的關鍵。通過Web Service,公司可以把關鍵的商務應用「暴露」給指定的供應商和客戶。例如,把電子下單系統和電子發票系統「暴露」出來,客戶就可以以電子的方式發送訂單,供應商則可以以電子的方式發送原料采購發票。當然,這並不是一個新的概念, EDI(電子文檔交換)早就是這樣了。但是,Web Service的實現要比EDI簡單得多,而且Web Service運行在Internet上,在世界任何地方都可輕易實現,其運行成本就相對較低。不過,Web Service並不像EDI那樣,是文檔交換或B2B集成的完整解決方案。Web Service只是B2B集成的一個關鍵部分,還需要許多其它的部分才能實現集成。 長項四: 軟體和數據重用 軟體重用是一個很大的主題,重用的形式很多,重用的程度有大有小。最基本的形式是源代碼模塊或者類一級的重用,另一種形式是二進制形式的組件重用。 當前,像表格控制項或用戶界面控制項這樣的可重用軟體組件,在市場上都佔有很大的份額。但這類軟體的重用有一個很大的限制,就是重用僅限於代碼,數據不能重用。原因在於,發布組件甚至源代碼都比較容易,但要發布數據就沒那麼容易,除非是不會經常變化的靜態數據。 Web Service在允許重用代碼的同時,可以重用代碼背後的數據。使用Web Service,再也不必像以前那樣,要先從第三方購買、安裝軟體組件,再從應用程序中調用這些組件;只需要直接調用遠端的Web Service就可以了。舉個例子,要在應用程序中確認用戶輸入的地址,只需把這個地址直接發送給相應的Web Service,這個Web Service 就會幫你查閱街道地址、城市、省區和郵政編碼等信息,確認這個地址是否在相應的郵政編碼區域。Web Service 的提供商可以按時間或使用次數來對這項服務進行收費。這樣的服務要通過組件重用來實現是不可能的,那樣的話你必須下載並安裝好包含街道地址、城市、省區和郵政編碼等信息的資料庫,而且這個資料庫還是不能實時更新的。 另一種軟體重用的情況是,把好幾個應用程序的功能集成起來。例如,要建立一個區域網上的門戶站點應用,讓用戶既可以查詢聯邦快遞包裹,查看股市行情,又可以管理自己的日程安排,還可以在線購買電影票。現在Web上有很多應用程序供應商,都在其應用中實現了這些功能。一旦他們把這些功能都通過Web Service 「暴露」出來,就可以非常容易地把所有這些功能都集成到你的門戶站點中,為用戶提供一個統一的、友好的界面。 將來,許多應用程序都會利用Web Service,把當前基於組件的應用程序結構擴展為組件/Web Service 的混合結構,可以在應用程序中使用第三方的Web Service 提供的功能,也可以把自己的應用程序功能通過Web Service 提供給別人。兩種情況下,都可以重用代碼和代碼背後的數據。