最近遇到一个项目需要用java调用.net做的webService,由于是头一次遇到,在网上看了很多方法仍没有解决,最后才知道我要调用的这个webService还要传入头信息,不过终于是解决了,方法如下。
public static void main(String[] args) throws ServiceException, RemoteException{
try
{
//服务端url
String endpointURL = "http://113.57.135.78/DataEngine/wsDataEngineForWebsite.asmx?wsdl";
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new java.net.URL(endpointURL));
call.setSOAPActionURI("http://tempuri.org/" + "ModifyCard");//要调用方法的url
call.setOperationName(new QName("http://tempuri.org/", "ModifyCard"));// 设置操作的名称。
//设置头信息
SOAPHeaderElement soapHeaderElement = new SOAPHeaderElement("http://tempuri.org/", "WSAuthHeader");
soapHeaderElement.setNamespaceURI("http://tempuri.org/");
try{
//设置头信息里需要的2个参数
soapHeaderElement.addChildElement("UserName").setValue("admin");
soapHeaderElement.addChildElement("Password").setValue("123");
}catch (SOAPException e){
e.printStackTrace();
}
call.addHeader(soapHeaderElement);
call.setReturnType(XMLType.XSD_STRING);// 返回的数据类型
//设置参数的名称与类型
call.addParameter("cardNo", XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter("Password", XMLType.XSD_STRING, ParameterMode.IN);
call.addParameter("NewPassword", XMLType.XSD_STRING, ParameterMode.IN);
String ret = (String) call.invoke(new Object[] {"arg1","arg2","arg3"});//执行调用 arg为要传递参数的值
System.out.println(ret.toString());//webService端返回的是String类型,所以可以在控制台输出
}catch (Exception e){
e.printStackTrace();
}
}
另导入的java文件如下:
import java.rmi.RemoteException;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.ServiceException;
import javax.xml.soap.SOAPException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.axis.message.SOAPHeaderElement;