这里的通用webservice客户端是指不用命令生成代码就可以完成的webservice客户端,很多时候在写webservice客户端时,都在猜对方用的什么服务端,猜不对,就不清楚用什么命令生成代码,索性就挨个试试,反正java就是3个,Axis、Axis2、CXF。要是java的客户端,接入服务端是.net的就闹心了,Axis、Axis2、CXF都能写通用客户端,另外HttpClient也可以写,就是代码有点麻烦,所以个人不太喜欢。这里主要是使用Axis的通用客户端代码,主要的好处是代码清晰易懂,坏处也很明显,
1.某些参数类型生成xml,服务端解析不了,这些参数需要自己抓包去看,这个需要克服技巧
2.不支持http1.1,这个主要体现是速度慢,网上倒是有方案修改,但是没弄过,换Axis2或CXF的试过是可以的
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import org.apache.axis.encoding.ser.BeanSerializerFactory;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import javax.xml.namespace.QName;
public class TestService {
public static void main(String[] args) throws Exception {
Service service = new Service();//new 一个服务
Call call = (Call) service.createCall();//创建一个call对象
//下面这条语句,当服务端是.net程序时,是必须写的(服务端是java可不用写),参数内容可见于wsdl文档中,targetNamespace/方法名
call.setTimeout(new Integer(60000));//注意设置超时时间
call.setTargetEndpointAddress(new java.net.URL("服务端地址"));
QName qn = new QName("targetNamespace或xmlns", "方法名");
call.setOperationName(qn);//设置要调用的接口方法
QName qn1 = new QName("targetNamespace或xmlns", "参数名");
call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);//返回参数类型
call.setUseSOAPAction(true);
String result = (String) call.invoke(new Object[]{参数});
System.out.println(result);//打印字符串
}}
排版真的有点费劲,大家见谅