一、前言:
今日部門的產品需要用到短信功能,需要走公司統一的接口,而該短信接口是由.net開發的,利用兩天時間徹底搞定了用java來調用.net 的web service,包括對soap header的處理。
二、解決方案
查詢了下java中對soap的支持,有幾種方案,有axis和xfire等,我這里先選擇的是axis的1.4版本,隨即開始開發,這里面有個大坑啊。就是java對類的屬性中的getXXXX方法解析后生成的xml文件的屬性首字母是小寫的,與.NET的生成的xml對不上,光這個問題耗費了很長的時間,最后依然決定用axis2來做,用了不到2個小時全部搞定。
三、遇到了問題怎么辦?
在使用axis1.4的過程中,遇到這樣的那樣的問題,我認為最大的問題在於用axis生成的xml文件與.net的不一致,所以才會有這樣那樣的問題,我的辦法是,安裝一個wireshark進行抓包,然后比對看看哪些屬性生成的不對這樣再去改代碼,事半功倍。關於wireshark的用法大家可以去google。
對於用axis的方案大家直接用axis2就好了,去官方下載一個,如果不清楚包的結構,直接把lib下的所有jar包都引進去吧。免得一個一個的引。
四、過程
前面說到了,需要認真看.net返回的xml文件,如果某個方法存在soap:Header的話,那么在java端就需要構造header,有可能不同的方法對應不同的header,這個需要看清楚了。
不說了,直接上過程及代碼。
1.下載axis2,這個是必須的,官方下載吧,然后解壓
2.打開命令控制台窗口,進入bin目錄,執行命令:wsdl2java.bat -uri
http://www.baidu.com/sample.asmx?wsdl
看到紅色的參數部分了吧,這個必須有。
3.之后會在bin目錄下生成一個src目錄,將生成的兩個類拷貝到項目中。
4.然后,那就是基本上和.net引用.net的web service一樣一樣的了。
OK,下面只給出一個例子,包含header頭、傳遞復雜類型及接收返回值
ServiceStub stub = new ServiceStub(); //這個是生成的類,可能你的類名和我的是不一樣的
stub._getServiceClient().getOptions().setProperty(org.apache.axis2.transport.http.HTTPConstants.CHUNKED, Boolean.FALSE);
//加入頭部驗證
WebSoapHeadE headerE=new WebSoapHeadE();//這里的生成的類可能和你的也不同
WebSoapHead header=new WebSoapHead();//這個header即是.net的web service的header頭
header.set.........//這里執行一些屬性賦值操作,一般包括用戶名和密碼之類
headerE.setWebSoapHead(header); //需要將該頭加進去
好了到這里我們的頭信息就構造完畢了,這里只是構造好了,需要到下面執行某個接口方法的時候把該頭傳遞進去。
再看傳遞自定義對象
比如我這里的這個發短信的業務,生成的方法為sendSms(自定義對象,頭信息);
好的這里我們需要構造這個自定義對象,原.net的sendSms方法的參數為一個自定義對象的數組,那么這里我們該怎么寫呢?
axis為我們提供了一個類似ArrayOfXXXX的包裝對象,構造這個對象然后將xxxx對象加進去即可。
到這里,我們基本完成了調用.net webservice的所有工作。
希望這篇文章能給你帶來幫助。
