下面的代码是Java client调用另一个后台发布的webservice,如下所示:
public static void main(String[] args) {
try {
String endpoint = "http://219.216.xx.xx:8080/clickdemo/WS/BasedService?wsdl";
// 直接引用远程的wsdl文件
// 以下都是套路
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(endpoint);
call.setOperationName(new QName("cn.edu.neu.dinner.app.ws.service", "CommonInvoke"));// WSDL里面描述的接口名称
call.addParameter("arg0", org.apache.axis.encoding.XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);// 接口的参数
call.addParameter("arg1", org.apache.axis.encoding.XMLType.XSD_STRING, javax.xml.rpc.ParameterMode.IN);// 接口的参数
call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);// 设置返回类型
// call.setSOAPActionURI("cn.edu.neu.dinner.app.ws.service."+"CommonInvoke");
String temp = "测试人员";
String param = Easy.save("russell westbrook");
String test_param = "<object type=\"array\" elementType=\"Object\" length=\"1\" id=\"0\"><object type=\"string\" value=\"where 1=1 \" id=\"1\" /></object>";
String result = (String) call.invoke(new Object[] { "queryBusinessService", test_param });
// 给方法传递参数,并且调用方法
System.out.println("result is " + result);
} catch (Exception e) {
System.err.println(e.toString());
}
}
踩过的坑:
通过axis调用,需要注意两点:
1)在call.setOperationName是必须通过Qname来制定namespaceURI
2)在设定参数时,不使用服务端定义的参数名,而是arg0~argN来定义,也不需制定namespaceURI,上述代码
call.addParameter(new QName(namespace, "TransNo"), XMLType.XSD_STRING, ParameterMode.IN);
修改为
call.addParameter("arg0", XMLType.XSD_STRING, ParameterMode.IN);
有几个参数,即设定几个。