在web项目中使用KSOAP2调用WebService

1、KSOAP2

适用于android调用webservice的一个很好的第三方类库,非常的小。下载地址:

https://code.google.com/archive/p/ksoap2-android/downloads

133356_HuKn_2458840.png

2、DOM4J

这个不多解释,java的XML API ,专门用来解析xml格式数据。使用这个来解析WSDL数据。下载地址:

https://dom4j.github.io/

133824_BRvM_2458840.png

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()&&parameter!=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,是不是会比实现客户端来的简单?!

 

转载于:https://my.oschina.net/ZL520/blog/1536701

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值