1. 程式人生 > >java客戶端動態呼叫webservice服務

java客戶端動態呼叫webservice服務

      之前呼叫webservice服務一直用jdk或者eclipse快速生成客戶端程式碼,這種方式實現起來也比較容易,據說這種方法執行效率也是最好的(動態呼叫也會動態生成客戶端程式碼)。但是我最近在專案發現這種方式存在一個嚴重的弊端,那就是當服務端有修改或變動,客戶端程式碼都得重新生成。特別是別人提供的服務端有生產環境和測試環境切換,導致客戶端原生代碼就得重新生成。所以我就尋思不用生成客戶端程式碼,通過地址動態呼叫

動態呼叫方式如下(其中兩種):還有其他好用的方式,歡迎提供,在此謝過

一、CXF提供的方式:

1.依賴的jar:

       cxf-2.5.4.jar,

        xmlschema-core-2.0.2.jar

       neethi-3.0.2.jar,wsdl4j-1.6.2.jar,

       commons-logging-1.1.1.jar

2. 程式碼參考如下:

import javax.xml.namespace.QName;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
public static void sendXmlByCXFWebService(){
  //注意:這種方式呼叫自己的釋出的webservice沒問題,
  //但是訪問http://ws.webxml.com.cn/上提供服務就報錯,暫時沒有找到解決方法,如果有哪位知道求指教,不甚感激!
  //服務地址
  String bipEndpoint = "http://127.0.0.1:8888/test?wsdl";
  JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
  org.apache.cxf.endpoint.Client client = dcf.createClient(bipEndpoint);
  Object[] objects;
  String result = "";
  try {
   //名稱空間:http://lfieng.com/  ,getName:方法,1829571****:方法的入參
   objects = client.invoke(new QName("http://lfieng.com/", "getName"), "1829571****");
   result = objects[0].toString();// 遠端呼叫
   // 輸出呼叫結果
   System.out.println("介面服務返回資料:\n" + result);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

二、axis提供的方式:

1.依賴的jar:

   axis.jar,

   jaxrpc.jar,

   commons-discovery-0.2.jar,

   commons-logging-1.1.1.jar,

   wsdl4j-1.6.2.jar

2.程式碼參考如下:

import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
public static void sendXmlByAxisWebService() throws Exception{
	//服務地址
	String requestUrl = "http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl";   
	String requestXml = "182957****";
	Object[] object = new Object[] { requestXml };//請求引數
	Service service = new Service();
	Call call = (Call) service.createCall();
	call.setTargetEndpointAddress(requestUrl);// 遠端呼叫路徑
	// 呼叫的名稱空間和方法名
	call.setOperationName(new QName("http://WebXml.com.cn/", "getMobileCodeInfo"));
	call.setUseSOAPAction(true); 
	//可以在wsdl中找個這個地址
	call.setSOAPActionURI("http://WebXml.com.cn/getMobileCodeInfo"); 
	//名稱空間和引數名,引數名不可以隨便寫,引數名可以在wsdl檔案中找到
	call.addParameter(new QName("http://WebXml.com.cn/","mobileCode"), 
        org.apache.axis.encoding.XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
        call.setReturnType(XMLType.XSD_STRING);// 返回值型別:String
	call.setTimeout(100000);//超時
	String result = (String) call.invoke(object);// 遠端呼叫
	System.out.println(result);
}