由于最近項目中遇到WebService應用,需要調用WebService提供的接口,搞了幾個小時,才正确的調用到接口。主要問題還是WebService接口在SOAP頭上面搞了些驗證的東西,需要傳一個SOAP頭過去。。。 Java調用WebService可以直接使用Apache提供的axis.jar自己編寫代碼,或者利用Eclipse自動生成WebService Client代碼,利用其中的Proxy類進行調用。理論上是一樣的,隻不過用Eclipse自動生成代碼省事些。 1、編寫代碼方式: package com.yudun.test; import java.rmi.RemoteException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.message.PrefixedQName;
import org.apache.axis.message.SOAPHeaderElement; import com.cezanne.golden.user.Exception;
import com.cezanne.golden.user.UserManagerServiceProxy; import javax.xml.namespace.QName;
import java.net.MalformedURLException; import javax.xml.rpc.ServiceException;
import javax.xml.soap.Name;
import javax.xml.soap.SOAPException;
public class testWebService { public static String getResult() throws ServiceException, MalformedURLException, RemoteException, SOAPException
{
//辨別Web Service的具體路徑
String endpoint = "WebService服務位址";
// 建立 Service執行個體
Service service = new Service();
// 通過Service執行個體建立Call的執行個體
Call call = (Call) service.createCall();
//将Web Service的服務路徑加入到call執行個體之中.
call.setTargetEndpointAddress( new java.net.URL(endpoint) );//為Call設定服務的位置 // 由于需要認證,故需要設定調用的SOAP頭資訊。
Name headerName = new PrefixedQName( new QName("釋出的wsdl裡的targetNamespace裡的url", "string_itemName") );
org.apache.axis.message.SOAPHeaderElement header = new SOAPHeaderElement(headerName);
header.addTextNode( "blablabla" );
call.addHeader(header);
// SOAPHeaderElement soapHeaderElement = new SOAPHeaderElement("釋出的wsdl裡的targetNamespace裡的url", "SoapHeader");
// soapHeaderElement.setNamespaceURI("釋出的wsdl裡的targetNamespace裡的url");
// try
// {
// soapHeaderElement.addChildElement("string_itemName").setValue("blablabla");
// }
// catch (SOAPException e)
// {
// e.printStackTrace();
// }
// call.addHeader(soapHeaderElement); //調用Web Service的方法
org.apache.axis.description.OperationDesc oper;
org.apache.axis.description.ParameterDesc param;
oper = new org.apache.axis.description.OperationDesc();
oper.setName("opName");
param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName("", "arg0"), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName(" http://www.w3.org/2001/XMLSchema", "string"), java.lang.String.class, false, false);
param.setOmittable(true);
oper.addParameter(param);
param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName("", "arg1"), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName(" http://www.w3.org/2001/XMLSchema", "string"), java.lang.String.class, false, false);
param.setOmittable(true);
oper.addParameter(param);
param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName("", "arg2"), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName(" http://www.w3.org/2001/XMLSchema", "string"), java.lang.String.class, false, false);
param.setOmittable(true);
oper.addParameter(param);
oper.setReturnType(new javax.xml.namespace.QName(" http://www.w3.org/2001/XMLSchema", "string"));
oper.setReturnClass(java.lang.String.class);
oper.setReturnQName(new javax.xml.namespace.QName("", "return"));
oper.setStyle(org.apache.axis.constants.Style.WRAPPED);
oper.setUse(org.apache.axis.constants.Use.LITERAL);
oper.addFault(new org.apache.axis.description.FaultDesc(
new javax.xml.namespace.QName("釋出的wsdl裡的targetNamespace裡的url", "Exception"),
"Exception",
new javax.xml.namespace.QName("釋出的wsdl裡的targetNamespace裡的url", "Exception"),
true
));
call.setOperation( oper );
call.setOperationName(new javax.xml.namespace.QName("釋出的wsdl裡的targetNamespace裡的url", "opName")); //調用Web Service,傳入參數
String res = ( String ) call.invoke( new Object[]("arg0","arg1"));
System.out.println("===============");
return res;
}
public static void main(String[] args) {
try {
System.out.println(getResult());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
} catch (ServiceException e) {
e.printStackTrace();
} catch (SOAPException e) {
e.printStackTrace();
}
} } 2、利用Eclipse自動生成WebService client代碼就容易多了:(由于還不會發圖檔,就用語言描述了,大家酬和看吧。。。) 首先,new project,選擇other,在輸入框中輸入Web Service Client,選中搜尋後的結果,點選Next,在Service definition中輸入 WebService的釋出位址,點選Finish
這樣,WebService Client代碼已經生成好了。 接下來寫一個Test類,在main函數中輸入如下代碼: String endpoint = "伺服器的WebService的位址";
YourWebServiceNameProxy umsp = new YourWebServiceNameProxy (endpoint);
try {
String resultStr = umsp.opMethod("arg0","arg1");
System.out.println(resultStr);
} catch (Exception e) {
System.out.println("異常");
e.printStackTrace(); } catch (RemoteException e) {
System.out.println("RemoteException異常");
e.printStackTrace();
}