前些天和我們的一個郵件服務商對接,雙方需要進行一些通訊,對方是java團隊,而作為.net團隊的我們,只能公佈出去的是一個wcf的basicbinding,想不
到問題來了,對方不知道怎麼去呼叫這個basic,可能他們水平有點菜,有點尷尬,不得已我來研究研究,其實只要知道公佈的wsdl,對什麼語言都是很簡單的。
一:案例
為了方便,我也不特意寫什麼程式碼了,就用vs裡面的wcf服務模板建立一下,詳細內容如下:
1 // 注意: 使用“重構”選單上的“重新命名”命令,可以同時更改程式碼、svc 和配置檔案中的類名“Service1”。 2 // 注意: 為了啟動 WCF 測試客戶端以測試此服務,請在解決方案資源管理器中選擇 Service1.svc 或 Service1.svc.cs,然後開始除錯。 3 public class Service1 : IService1 4 { 5 public string GetData(int value) 6 { 7 return string.Format("You entered: {0}", value); 8 } 9 10 public CompositeType GetDataUsingDataContract(CompositeType composite) 11 { 12 if (composite == null) 13 { 14 throw new ArgumentNullException("composite"); 15 } 16 if (composite.BoolValue) 17 { 18 composite.StringValue += "Suffix"; 19 } 20 return composite; 21 } 22 }
然後F5執行一下,就可以看到這樣的一個wcf測試客戶端,有服務地址,有提供的兩個方法契約。
二:java呼叫
1. 使用web service client
其實在eclipse的新建專案中有一個Web Service Client 模板,這個裡面就可以將wsdl轉換為proxy的java程式碼,有一點像C#中的服務引用,是不是,
下面就一步一步操作下:
《1》 新建一個java project,或者dynamic web project都是可以的,本次測試只新建一個MyJavaTest 的project。
《2》 然後使用 WebService Client的模板 File => Other =>Web Services => Web Service Client 即可。
《3》在Service definition 選項中輸入我們的wcf服務地址:http://localhost:54248/Service1.svc?wsdl,一定要注意
在svc後面加上一個wsdl,這樣就方便java proxy找到哈,然後左下角有一個“溫度計”,調到start client 模式就
好,然後繼續點選下一步,詳細如下圖:
《4》 下圖就表示生成好的程式碼將放入到哪一個目錄下,這個沒什麼好說的。
《5》然後點選finish,現在你會發現,你多了幾個自動化的java類,便捷性和visual studio有的一拼。
好了,自動化的類都出來了,接下來我只需要新建了一個入口的Program類,是不是就可以敲定了。。。
1 package com.datamip; 2 3 import java.rmi.RemoteException; 4 5 import org.tempuri.IService1Proxy; 6 7 public class Program { 8 9 public static void main(String[] args) throws RemoteException { 10 11 IService1Proxy proxy = new IService1Proxy(); 12 13 String result = proxy.getData(12345); 14 15 System.out.println(result); 16 } 17 18 }
不過要吐槽的是,IService1Proxy居然是一個類,我還以為是介面呢,思維定勢吧~~~
2. 使用wsimport小工具
其實java的jdk裡面有很多的實用小工具,其中就有一款wsimport.exe,它就可以用來根據wsdl生成自動化的proxy類,和.net的svcutil的功能
是一樣的。
由於jdk路徑都配置到了環境變數中,就可以在cmd中看一下wsimport需要的引數。
C:\Users\hxc>wsimport 缺少 WSDL_URI 用法: wsimport [options] <WSDL_URI> \其中 [options] 包括: -b <path> 指定 jaxws/jaxb 繫結檔案或附加模式 (每個 <path> 都必須具有自己的 -b) -B<jaxbOption> 將此選項傳遞給 JAXB 模式編譯器 -catalog <file> 指定用於解析外部實體引用的目錄檔案 支援 TR9401, XCatalog 和 OASIS XML 目錄格式。 -d <directory> 指定放置生成的輸出檔案的位置 -encoding <encoding> 指定原始檔所使用的字元編碼 -extension 允許供應商擴充套件 - 不按規範 指定功能。使用擴充套件可能會 導致應用程式不可移植或 無法與其他實現進行互操作 -help 顯示幫助 -httpproxy:<host>:<port> 指定 HTTP 代理伺服器 (埠預設為 8080) -keep 保留生成的檔案 -p <pkg> 指定目標程式包 -quiet 隱藏 wsimport 輸出 -s <directory> 指定放置生成的原始檔的位置 -target <version> 按給定的 JAXWS 規範版本生成程式碼 預設為 2.2, 接受的值為 2.0, 2.1 和 2.2 例如, 2.0 將為 JAXWS 2.0 規範生成相容的程式碼 -verbose 有關編譯器在執行什麼操作的輸出訊息 -version 輸出版本資訊 -wsdllocation <location> @WebServiceClient.wsdlLocation 值 -clientjar <jarfile> 建立生成的 Artifact 的 jar 檔案以及 呼叫 Web 服務所需的 WSDL 後設資料。 -generateJWS 生成存根 JWS 實現檔案 -implDestDir <directory> 指定生成 JWS 實現檔案的位置 -implServiceName <name> 生成的 JWS 實現的服務名的本地部分 -implPortName <name> 生成的 JWS 實現的埠名的本地部分 \擴充套件: -XadditionalHeaders 對映標頭不繫結到請求或響應訊息不繫結到 Java 方法引數 -Xauthfile 用於傳送以下格式的授權資訊的檔案: http://username:password@example.org/stock?wsdl -Xdebug 輸出除錯資訊 -Xno-addressing-databinding 允許 W3C EndpointReferenceType 到 Java 的繫結 -Xnocompile 不編譯生成的 Java 檔案 -XdisableAuthenticator 禁用由 JAX-WS RI 使用的驗證程式, 將忽略 -Xauthfile 選項 (如果設定) -XdisableSSLHostnameVerification 在提取 wsdl 時禁用 SSL 主機名 驗證 \示例: wsimport stock.wsdl -b stock.xml -b stock.xjb wsimport -d generated http://example.org/stock?wsdl C:\Users\hxc>
這其中,大概知道下面4個引數就好說了。
《1》 url: 你需要生成代理類的資料來源,也就是wsdl檔案
《2》 -d: 生成的proxy檔案需要存放的路徑
《3》-p: 生成proxy類的包名。
《4》-keep:儲存生成的檔名
接下來我們就cmd試一下:
C:\Users\hxc>wsimport http://localhost:54248/Service1.svc?wsdl -d c:\\2\\ -p com.datamip.proxy -keep 正在解析 WSDL... 正在生成程式碼... 正在編譯程式碼... C:\Users\hxc>
好了,接下來就可以將“資料夾2”中的proxy類copy到project中,如下圖:
看起來是不是很完美,那接下來要做的事情就是coding驗證啦~~~
最後還有一種笨的方法,那就是通過fiddler抓取webservice通訊的引數,然後通過httppost模擬提交,也是可以的。。。好了,本篇就和大家說到
這裡,希望對你有幫助。