使用java呼叫webservice
一、Web Services以XML作為資料交換的標準格式,它是跨平臺的應用,允許以任何方式建立Web Services,在.NET、Java平臺上訪問。
在Java平臺建立和訪問Web Service多通過Axis完成。Axis本質上就是一個SOAP引擎,提供建立伺服器端、客戶端和閘道器SOAP操作的基本框架。Axis目前版本是為Java編寫的。在使用Axis訪問Web Service時,需要引入以下包(10個):axis-ant.jar、axis.jar、commons-discovery-0.2.jar、commons-logging-1.0.4.jar、jaxrpc.jar、log4j-1.2.8.jar、saaj.jar、wsdl4j-1.5.1.jar、activation-1.1.jar和mail-1.4.jar。
(1)訪問Java建立的Web Service 在當前Java客戶端應用中新增相應的10個Axis包,編寫客戶端程式:
/** * @param url 介面地址 * @param xml //報文 * @return 返回的報文 */ public static String getWSDLCall(String url, String xml){ String result = ""; try { Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress(url); call.setOperationName(new QName("http://tempuri.org/", "HelloWorld")); //需要傳入引數的時候使用 //call.addParameter("xml", org.apache.axis.encoding.XMLType.XSD_DATE, //javax.xml.rpc.ParameterMode.IN);//介面的引數 //call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);//設定返回型別 result = (String)call.invoke(new Object[]{xml}); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return result; }
二、java呼叫.net開發的webservice的時候,如果大家遇到以下問題,可以參考下解決辦法:
1、出現的問題大多是因為沒有引入響應的jar包,如果使用Axis的話,將以上10個包引入後應該沒有什麼問題
2、用java呼叫時總提示:faultString: 伺服器未能識別 HTTP 標頭 SOAPAction 的值:
上網找了解決方法,最好修改的結果如下:
.net WebService程式碼:
在webservicenamespace後面增加:
[SoapDocumentService(RoutingStyle=SoapServiceRoutingStyle.RequestElement)]
--------------------——————————————————
3、無法識別請求元素 <GetTestQuestions xmlns=''>
解決辦法:
將 call.setOperationName(new QName("", "GetTestQuestions"));
改為call.setOperationName(new QName("自己的名稱空間", "GetTestQuestions"));
--------------------——————————————————
4、在傳遞基本資料的時候,服務端接收的引數為null
解決辦法:
//需要傳入引數的時候使用,name是webservice方法的引數名,XSD_STRING是引數型別,一定要嚴格對應 call.addParameter(new QName(XmlNamespace,"name"), org.apache.axis.encoding.XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
而下面這種傳引數的寫法,服務端獲取的是null
call.addParameter("name", org.apache.axis.encoding.XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
希望能夠幫到大家O(∩_∩)O