1. 程式人生 > >axis2呼叫 .net的webservice asmx

axis2呼叫 .net的webservice asmx

源自: http://cqyqing.iteye.com/blog/1668227

   1、下載axis2(到apache官網下載www.apache.org)
   2、我下載的是axis2-1.5-bin.zip,解壓到當前資料夾
   3、進入bin目錄(F:\study\java\service\axis2\axis2-1.5\bin)
   4、開啟cmd,進入第3步的bin目錄,輸入wsdl2java.bat -uri http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl,回車
         可能會提示錯誤,設定一下JAVA_HOME 和 AXIS2_HOME 就好(在WIN的環境變數下面,記得log-off或者重起)
   5、之後會在bin目錄下生成一個src目錄,將src目錄下的兩個類考到eclipse開發目錄下
   6、建一個測試類Test,程式碼如下


    import cn.com.webxml.WeatherWebServiceStub;  
    import cn.com.webxml.WeatherWebServiceStub.ArrayOfString;  
    import cn.com.webxml.WeatherWebServiceStub.GetWeatherbyCityName;  
      
      
    public class Test {  
      
        public static void test1(){  
            try{  
                WeatherWebServiceStub stub = new WeatherWebServiceStub();  
                stub._getServiceClient().getOptions().setProperty(    
                        org.apache.axis2.transport.http.HTTPConstants.CHUNKED,    
                        Boolean.FALSE);  
                GetWeatherbyCityName city = new GetWeatherbyCityName();  
                city.setTheCityName("廣州");  
                ArrayOfString array = stub.getWeatherbyCityName(city).getGetWeatherbyCityNameResult();  
                String[] str = array.getString();  
                for(String s : str){  
                    System.out.println(s);  
                }  
            }catch(Exception e){  
                e.printStackTrace();  
            }  
        }  
          
        /** 
         * @param args 
         */  
        public static void main(String[] args) throws Exception{  
            test1();  
        }  
      
    }  

原貼的說明,要看一下,有助理解:


需要注意的是這個類GetWeatherbyCityName,這個本來是.net webservice中的一個方法,如下

    POST /WebServices/WeatherWebService.asmx HTTP/1.1  
    Host: www.webxml.com.cn  
    Content-Type: text/xml; charset=utf-8  
    Content-Length: length  
    SOAPAction: "http://WebXml.com.cn/getWeatherbyCityName"  
      
    <?xml version="1.0" encoding="utf-8"?>  
    <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">  
      <soap:Body>  
        <getWeatherbyCityName xmlns="http://WebXml.com.cn/">  
          <theCityName>string</theCityName>  
        </getWeatherbyCityName>  
      </soap:Body>  
    </soap:Envelope>  

用axis2生成java程式碼後,會自動生成一個對應的物件,webservice需要傳遞的引數,可以通過對這個物件賦值操作完成,如上面,我要查廣州的天氣,就設定為city.setTheCityName("廣州");
注意,關鍵的地方
由於.net webservice中返回的是ArrayOfString,java中沒有這個物件,所以axis2會自動生成這個物件,然後轉換成對應的陣列即可,如String[] str = array.getString();在axis版本中,使用的是返回型別,但是返回型別設定其他的比如String等都會報錯,只能設定成VECTOR,即call.setReturnType(XMLType.SOAP_VECTOR),如果只返回一個字串,可以直接使用STRING;這樣才能確保返回正確。

這樣一來,很符合我這個沒什麼時間的懶人,因為有CodeGen。