9.BDF2-WEBSERVICE-CLIENT

2023-07-03 17:28 更新
為了幫助我們的程序能快速調(diào)用目標(biāo)Webservice服務(wù),BDF2-WEBSERVICE-CLIENT模塊提供了一個調(diào)用Webservice服務(wù)的客戶端,利用這個客戶端,通過幾行簡單的代碼,就可以實現(xiàn)對目標(biāo)Webservice服務(wù)的調(diào)用。在使用空上客戶端時,它既可以調(diào)用那些不需要任何安全性驗證的Webservice,也可以調(diào)用那些使用WS-Security進行認證的Webservice,同時對于一些采用HttpBasic進行認證的Webservice,我們的Webservice調(diào)用客戶端也提供了支持。

為了演示這個客戶端的具體用法,接下來我們用這個客戶端來嘗試調(diào)用在BDF2-WEBSERVICE模塊當(dāng)中介紹的示例Webservice,看看它能不能調(diào)用成功并為我們返回正確的結(jié)果。具體調(diào)用代碼如下:

WebserviceClient類調(diào)用Webservice測試
package ws;
import com.bstek.bdf2.webservice.client.WebServiceClient;
public class WebserviceInvokeTest {
 public static void main(String[] args) throws Exception{
 String uri="http://localhost:8080/bdf2-test/dorado/webservice/requestUserWebService";
 
 //設(shè)置Webservice客戶端要調(diào)用的目標(biāo)Webservice的地址
 WebServiceClient client=new WebServiceClient(uri);
 
//設(shè)置要調(diào)用的目標(biāo)Webservice的WS-Security認證所需要的username及password,以及是否對用戶名及密碼進
行加密傳輸
 client.setUsernameToken("admin", "81c1206f28f2738cdf714b4e10428c66f58eee10", true);
 
 /**
 * 設(shè)置要調(diào)用的目標(biāo)Webservice的Http Basic認證所需要的username及password,
 * Http Basic認證當(dāng)中所使用的密碼為加密之前的密碼,而非被加密之后的密碼
 * */
 //client.setHttpAuthenticationCredentials("admin", "admin");
 
 UserRequest request= new UserRequest();
 request.setTargetCompany("bstek");
 request.setUserCount(2);
 
 //設(shè)置在調(diào)用目標(biāo)Webservice過程當(dāng)中,需要將Javabean與XML進行相互序列化的Javabean類的class
 client.setMarshallerClasses(new Class[]{UserRequest.class,UserResponse.class});
 
 //發(fā)送調(diào)用請求并返回調(diào)用結(jié)果
 UserResponse response=(UserResponse)client.sendAndReceive(request);
 
 //輸出返回結(jié)果
 for(User user:response.getUsers()){
 System.out.println("username:"+user.getUsername() +" company:"+user.getCompanyId());
 }
 }
}
在這個測試代碼當(dāng)中,我們來看看其中要調(diào)用的目標(biāo)Webserivce的uri,這個uri的值為“http://localhost:8080/bdf2-test/dorado/webservice/requestUserWebService”,實際上這個值是從我們之前生成的WSDL中獲取的,再來看看我們的UserService.wsdl中最后那個service部分,如下圖所示:


可以看到,這個uri的值源自我們的wsdl,實際上在編寫Webservice調(diào)用客戶端時,我們需要好好研究目標(biāo)Webservice產(chǎn)生的WSDL文件,要通過這個文件知道目標(biāo)Webservice的調(diào)用地址是什么(uri),需要傳遞的入?yún)⑹鞘裁?,出參又是什么等,只有了解這些信息之后,才能確定該如何編寫我們的Webservice調(diào)用客戶端,所以,對于使用Webservice的廣大程序員來說,了解并能讀懂WSDL是何其重要。

因為Webservice是標(biāo)準(zhǔn)的,所以除了可以采用BDF2提供的WebserviceClient實現(xiàn)調(diào)用外,還可以采用其它工具實現(xiàn),比如之前介紹的SoapUI就是一例。下面我們就以XFire的Dynamic Client為例,演示下如何使用XFire的Dynamic Client來調(diào)用我們的這個UserService,其代碼如下:
基于XFire的Dynamic Client實現(xiàn)Webservice調(diào)用
package test;
import java.net.URL;
import org.apache.xerces.dom.DocumentImpl;
import org.codehaus.xfire.client.Client;
import org.jdom.Element;
import org.jdom.Text;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class SimpleTest {
 public static void main(String[] args) throws Exception{
 URL url=new URL("http://localhost:8080/bdf2-test/dorado/webservice/UserService.wsdl");
 Client client=new Client(url);
 Element root=new Element("UserRequest");
 Element company=new Element("targetCompany");
 company.setContent(new Text("bstek"));
 root.addContent(company);
 
 Element userCount=new Element("userCount");
 userCount.setContent(new Text("2"));
 root.addContent(userCount);
 
 Object[] obj=client.invoke("User",new Object[]{root});
 DocumentImpl doc=(DocumentImpl)obj[0];
 Node node=doc.getFirstChild().getFirstChild();
 NodeList list=node.getChildNodes();
 for(int i=0;i<list.getLength();i++){
 Node userNode=list.item(i);
 System.out.println("username:"+userNode.getFirstChild().getTextContent());
 
 }
 }
}

關(guān)于XFire的DynamicClient大家可以到其官網(wǎng)了解,這里需要指出的是在調(diào)用client的invoke時,它的第二個參數(shù)可以接受一個jdom的DOM對象,利用這個特性我們創(chuàng)建一個基于JDOM的UserRequest的DOM對象,并將需要的信息填充到這個XML的DOM當(dāng)中,最后作為參數(shù)提交給XFire的DynamicClient去處理,XFire的Dynamic Client將給出的參數(shù)構(gòu)建為SOAP消息傳遞給服務(wù)器處理。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號