1、KSOAP2
适用于android调用webservice的一个很好的第三方类库,非常的小。下载地址:
2、DOM4J
这个不多解释,java的XML API ,专门用来解析xml格式数据。使用这个来解析WSDL数据。下载地址:
3、开始编写webservice调用工具类
- 先看下代码
package com.msa.msaqydev.util;import java.io.IOException;import java.util.LinkedHashMap;import java.util.Map;import java.util.Map.Entry;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;import org.ksoap2.SoapEnvelope;import org.ksoap2.serialization.SoapObject;import org.ksoap2.serialization.SoapSerializationEnvelope;import org.ksoap2.transport.HttpTransportSE;import org.xmlpull.v1.XmlPullParserException;import net.sf.json.JSONArray;import net.sf.json.JSONObject;public class WebServiceTools { /** * 根据url得到返回数据 * 固定访问名称为 * @param url * @return * @throws DocumentException * @throws XmlPullParserException * @throws IOException */ public static String getDataByUrl(String url,String methods,String parameter) throws DocumentException, IOException, XmlPullParserException { String nameSpace=""; String result=""; nameSpace = gettargetNamespace(url); result =getRemoteInfo(nameSpace,url,methods, parameter); return result; } /** * 根据多个参数获取返回数据 * 请使用map的有序实现LinkedHashMap * 因为这里每个webparam是有固定顺序的,需要一一对应 * * @param url * @param methods * @param parameter * @return * @throws DocumentException * @throws IOException * @throws XmlPullParserException */ public static String getDatasByUrl(String url,String methods,Mapparameter) throws DocumentException, IOException, XmlPullParserException { String nameSpace=""; String result=""; nameSpace = gettargetNamespace(url); result =getRemoteInfo(nameSpace,url,methods, parameter); return result; } /** * 根据wsdl地址得到命名空间 * @param url * @return * @throws DocumentException */ public static String gettargetNamespace(String url) throws DocumentException{ SAXReader reader = new SAXReader(); Document document = reader.read(url); Element root = document.getRootElement(); return root.attributeValue("targetNamespace"); } /** * 根据多个参数获取命名空间 * @param targetNamespace * @param url * @param methods * @param parameter 这里要使用LinkedHashMap * @return * @throws IOException * @throws XmlPullParserException */ public static String getRemoteInfo(String targetNamespace,String url,String methods,Map parameter) throws IOException, XmlPullParserException { String urls=url.replace("?wsdl", ""); // 命名空间 String nameSpace = targetNamespace; // 调用的方法名称 String methodName = methods; // EndPoint String endPoint = url; // SOAP Action //String soapAction = targetNamespace+urls; // 指定WebService的命名空间和调用的方法名 SoapObject rpc = new SoapObject(nameSpace, methodName); //参数不存在,或者空集合,则不添加属性 if(!parameter.isEmpty()&¶meter!=null){ for(Entry entry : parameter.entrySet()){ rpc.addProperty( entry.getKey(), entry.getValue()); } } // 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope( SoapEnvelope.VER11); envelope.bodyOut = rpc; // 设置是否调用的是dotNet开发的WebService envelope.dotNet = false; // 等价于envelope.bodyOut = rpc; envelope.setOutputSoapObject(rpc); HttpTransportSE transport = new HttpTransportSE(endPoint); // 调用WebService 此处必须为null,否则就会报错 transport.call(null, envelope); // 获取返回的数据 SoapObject object = (SoapObject) envelope.bodyIn; // 获取返回的结果 String result = object.getProperty(0).toString(); //System.out.println(result); return result; // 将WebService返回的结果显示在TextView中 } public static String getRemoteInfo(String targetNamespace,String url,String methods,String parameter) throws IOException, XmlPullParserException { String urls=url.replace("?wsdl", ""); // 命名空间 String nameSpace = targetNamespace; // 调用的方法名称 String methodName = methods; // EndPoint String endPoint = url; // SOAP Action //String soapAction = targetNamespace+urls; // 指定WebService的命名空间和调用的方法名 SoapObject rpc = new SoapObject(nameSpace, methodName); //参数如果为空,则不加此属性 if(parameter!=null&&!parameter.equals("")){ rpc.addProperty( "arg0", parameter); } // 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope( SoapEnvelope.VER11); envelope.bodyOut = rpc; // 设置是否调用的是dotNet开发的WebService envelope.dotNet = false; // 等价于envelope.bodyOut = rpc; envelope.setOutputSoapObject(rpc); HttpTransportSE transport = new HttpTransportSE(endPoint,60000); // 调用WebService 此处必须为null,否则就会报错 transport.call(null, envelope); SoapObject object = (SoapObject) envelope.bodyIn; // 获取返回的结果 String result = object.getProperty(0).toString(); //System.out.println(result); return result; // 将WebService返回的结果显示在TextView中 } }
关于KSOAP2调用webservice的详细解释,请参考下博客
这样去调用webservice,是不是会比实现客户端来的简单?!