關於webservice的三種java客戶端對接方法
第一次寫文章,所以裡邊會有些措辭或者描述不清楚的問題,請見諒
首先webservice大家肯定已經耳熟能詳了,而且webservice屬於比較古老的技術,但一些比較老的公司,由於架構的比較早,而且經歷數次迭代,人員更替,舊的技術很難優化,所以難免會遇到對接webservice介面的需求。
對接webservice需要先了解下邊的一些知識。
1、XML:(Extensible Markup Language)擴充套件型可標記語言。面向短期的臨時資料處理、面向全球資訊網絡,是Soap的基礎。 2、Soap:(Simple Object Access Protocol)簡單物件存取協議。是XML Web Service 的通訊協議。當用戶通過UDDI找到你的WSDL描述文件後,他通過可以SOAP呼叫你建立的Web服務中的一個或多個操作。SOAP是XML文件形式的呼叫方法的規範,它可以支援不同的底層介面,像HTTP(S)或者SMTP。 3、WSDL:(Web Services Description Language) WSDL 檔案是一個 XML 文件,用於說明一組 SOAP 訊息以及如何交換這些訊息。大多數情況下由軟體自動生成和使用。 4、UDDI (Universal Description, Discovery, and Integration) 是一個主要針對Web服務供應商和使用者的新專案。在使用者能夠呼叫Web服務之前,必須確定這個服務內包含哪些商務方法,找到被呼叫的介面定義,還要在服務端來編制軟體,UDDI是一種根據描述文件來引導系統查詢相應服務的機制。UDDI利用SOAP訊息機制(標準的XML/HTTP)來發布,編輯,瀏覽以及查詢註冊資訊。它採用XML格式來封裝各種不同型別的資料,並且傳送到註冊中心或者由註冊中心來返回需要的資料。
接下來就是對接webservice的幾種方法
一、生成客戶端方式
1、生成webservice客戶端,一種可以通過開發工具如eclipse、idea生成,也可以通過工具如apache-cxf通過jdk命令生成
eclipse生成:
(1)、建立一個java project專案
(2)、在專案的src資料夾右鍵-->new-->other-->web service client
(3)、輸入webservice的介面地址,選擇finish
apache-cxf生成客戶端:
(1)、安裝apache-cxf,我這裡安裝的是apache-cxf-2.7.7,需要配置環境變數,且jdk1.7,1.6都可以,但不能為1.8,這很重要,否則會報錯,安裝過程及配置環境變數就不詳說了,可自行搜尋安裝
注:cxf生成的客戶端,是需要cxf的jar包的,可以自行下載,或者找我要
(2)、cmd執行命令
wsdl2java -encoding utf-8 -p 包名 -d 儲存路徑 webservice介面wsdl地址
注:-encoding utf-8是對生成客戶端編碼進行設定,可自行匹配專案編碼進行調整,去掉的話預設gbk
2、客戶端程式碼編寫
如果生成了客戶端,首先需要先了解是否有介面的實現類可以供我們直接呼叫,如果無的話,可以使用JaxWsDynamicClientFactory或者JaxWsProxyFactoryBean來通過介面service建立介面實現類物件,
JaxWsDynamicClientFactory方法:
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setAddress("***********?wsdl");
factory.setServiceClass(UISearchHotelService.class);//介面類
UISearchHotelService service = (UISearchHotelService) factory.create();
Map<String, Object> outProps = new HashMap<String, Object>();
outProps.put(WSHandlerConstants.ACTION,WSHandlerConstants.USERNAME_TOKEN);
// 這個使用者即伺服器端配置的使用者名稱
outProps.put(WSHandlerConstants.USER, "client"); //隨便填 ,但是不可不填
outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_DIGEST);
Client client = ClientProxy.getClient(service);
Endpoint cxfEndpoint = client.getEndpoint();
cxfEndpoint.getEndpointInfo().setProperty("set-jaxb-validation-event-handler", "false");
cxfEndpoint.getOutInterceptors().add(new LoggingOutInterceptor());
cxfEndpoint.getOutInterceptors().add(new WSS4JOutInterceptor(outProps));
JaxWsProxyFactoryBean方式:
JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance();
Client client = clientFactory.createClient("*****?wsdl");
Object[] result = client.invoke("sayHello", "KEVIN");
invoke方法的第一個引數是方法名稱,第二個是引數名稱
二、不生成客戶端,直接通過httpclient實現
不得不說,這種方法一般都是優先考慮的,因為客戶端會強加程式碼,而且還需要後期維護,比較繁瑣,相比較而言,httpclient是最簡便的方法
String soapRequestData = "這塊是xml的頭,體以及引數的拼接";
System.out.println(soapRequestData);
PostMethod postMethod = new PostMethod("********?wsdl");
// 然後把Soap請求資料新增到PostMethod中
byte[] b;
try {
b = soapRequestData.getBytes("utf-8");
InputStream is = new ByteArrayInputStream(b, 0, b.length);
RequestEntity re = new InputStreamRequestEntity(is, b.length,"application/soap+xml; charset=utf-8");
postMethod.setRequestEntity(re);
// 最後生成一個HttpClient物件,併發出postMethod請求
HttpClient httpClient = new HttpClient();
int statusCode = httpClient.executeMethod(postMethod);
if(statusCode == 200) {
System.out.println("呼叫成功!");
String soapResponseData = postMethod.getResponseBodyAsString();
System.out.println(soapResponseData);
} else {
System.out.println("呼叫失敗!錯誤碼:" + statusCode);
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (HttpException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
可以加我QQ:838101520,資源的話,我稍後會上傳,或者找我要