JAVA調用.NET WebService終極方案(包含對SoapHeader的處理)

1、前言:
     今日部門的產品須要用到短信功能,須要走公司統一的接口,而該短信接口是由.net開發的,利用兩天時間完全搞定了用java來調用.net 的web service,包括對soap header的處理。
2、解決方案
     查詢了下java中對soap的支持,有幾種方案,有axis和xfire等,我這裏先選擇的是axis的1.4版本,隨即開始開發,這裏面有個大坑啊。就是java對類的屬性中的getXXXX方法解析後生成的xml文件的屬性首字母是小寫的,與.NET的生成的xml對不上,光這個問題耗費了很長的時間,最後依然決定用axis2來作,用了不到2個小時所有搞定。
3、遇到了問題怎麼辦?
     在使用axis1.4的過程當中,遇到這樣的那樣的問題,我認爲最大的問題在於用axis生成的xml文件與.net的不一致,因此纔會有這樣那樣的問題,個人辦法是,安裝一個wireshark進行抓包,而後比對看看哪些屬性生成的不對這樣再去改代碼,事半功倍。關於wireshark的用法你們能夠去google。
     對於用axis的方案你們直接用axis2就行了,去官方下載一個,若是不清楚包的結構,直接把lib下的全部jar包都引進去吧。省得一個一個的引。
4、過程
     前面說到了,須要認真看.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的全部工做。
          但願這篇文章能給你帶來幫助。
相關文章
相關標籤/搜索