1、KSOAP2
适用于android调用webservice的一个很好的第三方类库,非常的小。下载地址:
https://code.google.com/archive/p/ksoap2-android/downloads
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,Map<String,Object> parameter) 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<String,Object> 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<String, Object> 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的详细解释,请参考下博客
在Android 中使用KSOAP2调用WebService
这样去调用webservice,是不是会比实现客户端来的简单?!