文档章节

在web项目中使用KSOAP2调用WebService

哥本哈根的小哥
 哥本哈根的小哥
发布于 2017/09/13 13:56
字数 807
阅读 54
收藏 1

1、KSOAP2

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

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

2、DOM4J

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

https://dom4j.github.io/

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

 

© 著作权归作者所有

共有 人打赏支持
哥本哈根的小哥
粉丝 5
博文 33
码字总数 14693
作品 0
东城
程序员
私信 提问
Android调用WebService

WebService是一种基于SOAP协议的远程调用标准,通过webservice可以将不同操作系统平台、不同语言、不同技术整合到一块。在 Android SDK中并没有提供调用WebService的库,因此,需要使用第三方...

风中海岸
2014/07/02
0
0
android使用ksoap2与nusoap交互异常求解

运行环境:eclipse jino; android sdk version 17; 问题描述: 我最近自学android开发的时候,使用ksoap2调用webservice。服务器端用php做的server。所以就采用了ksoap2与nusoap的交互实现了...

BernardXiong
2013/07/04
559
2
在Android中调用C#写的WebService

由于项目中要使用Android调用C#写的WebService,于是便有了这篇文章。在学习的过程中,发现在C#中直接调用WebService方便得多,直接添加一个引用,便可以直接使用将WebService当做一个对象使...

guorongjin
2015/12/30
1
0
谁提供ksoap2 android 使用实例

最近一个项目android调用dot net写的webservice,不想写xml解析部分,找了ksoap2-android可以解决这个问题,现在一个方法返回自定义数据的 list,不知道怎么取得这返回的 list数据 ?麻烦给个...

Jack王传杰
2013/09/09
629
2
Android调用.net webservice 服务器接收不到参数

在maven中如何配置xson依赖 <> android用ksoap2调用.net的WebService传参数,服务器接收出现为空的情况

Clownflsh
2014/07/22
1K
2

没有更多内容

加载失败,请刷新页面

加载更多

【Mysql技术内幕】第2章 InnoDB存储引擎

2.6 InnoDB关键特性 插入缓冲 两次写 自适应哈希索引 异步IO 刷新邻接页 2.6.1 插入缓冲 通常应用程序中行记录的插入顺序是按照主键的递增顺序进行插入的,因此插入聚集索引(Primary Key)一...

HOT_POT
59分钟前
2
0
Java8 如何正确使用 Optional

原文链接:https://blog.kaaass.net/archives/764 Optional是Java8提供的为了解决null安全问题的一个API。善用Optional可以使我们代码中很多繁琐、丑陋的设计变得十分优雅。这篇文章是建立在...

大灰狼时间
今天
3
0
富兰克林的人生信条

春节假期期间读了富兰克林自传,这位饱经风霜的老人出身贫寒,只读过两年书,但是通过刻苦自学和不懈奋斗还是取得了令人难以置信的成就,他的一生可以作为我们普通人的励志典范。 富兰克林 ...

春哥大魔王的博客
今天
1
0
不用中间变量交换 a ,b(三种方法)

1、加减法:该方法可以交换整型和浮点型数值的变量,但在处理浮点型的时候有可能出现精度的损失。 a = a + b; b = a - b; a = a - b; 2、异或法:可以完成对整型变量的交换,对于浮点型变量它...

robslove
今天
6
0
一文了解 OutOfMemory 及解决方案

1. Java 堆空间 发生频率 5颗星 造成原因 无法在 Java 堆中分配对象 吞吐量增加 应用程序无意中保存了对象引用,对象无法被 GC 回收 应用程序过度使用 finalizer。finalizer 对象不能被 GC 立...

java菜分享
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部