webService,soap,wsdl的基本概念?

详情请看维基百科

基于soap 1.1, soap 1.2 的请求和响应数据源

查找了很久都是基于json格式传输数据,但是最终还是找到了基于xml webservice的接口 http://ws.webxml.com.cn/WebServices/WeatherWS.asmx,里面提供了一些省市天气查询,国家名称以及对应id查询等。

ksoap2 调用WebService

1:要在android上调用,我们首先下载ksoap2-android jar包,丢到lib包下,添加依赖

2:接着我们提取出一个请求的工具类SoapConfig,SoapConfig 的全部代码如下

import org.ksoap2.HeaderProperty;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE; import java.util.ArrayList;
import java.util.Map;
import java.util.Set; import io.reactivex.Single;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
import issue.cn.net.wanji.issueneimeng.network.ApiService; public class SoapConfig {
public static final String WEB_SERVER_URL = "http://ws.webxml.com.cn/WebServices/WeatherWS.asmx";
public static volatile HttpTransportSE httpTransportSE = null;
public static volatile SoapSerializationEnvelope envelope = null;
public static SoapObject soapObject = null; // 命名空间
public static final String NAME_SPACE = "http://webservice.eisi.hgsoft.com"; public static final String NAME = "EISIService"; public static HttpTransportSE getHttpTransportSE() {
if (httpTransportSE == null) {
httpTransportSE = new HttpTransportSE(ApiService.URL);
}
return httpTransportSE;
} public static SoapObject getSoapObject() {
soapObject = null;
soapObject = new SoapObject(NAME_SPACE, NAME);
return soapObject;
} public static Single sendData(Map<String, Object> queryParamsMap, Map<String, Object> headerParamsMap) {
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12);
SoapObject request = getSoapObject(); //添加请求参数
if (queryParamsMap != null && queryParamsMap.size() > 0) {
Set<String> keys = queryParamsMap.keySet();
for (String queryKey : keys) {
Logger.i("参数");
Logger.i(queryKey + ":" + queryParamsMap.get(queryKey));
request.addProperty(queryKey, queryParamsMap.get(queryKey));
}
}
envelope.bodyOut = request;
return Single.create(emitter -> {
SoapConfig.getHttpTransportSE().call(null, envelope, addHeadProperty(headerParamsMap));
if (envelope.getResponse() != null) {
emitter.onSuccess(envelope);
} else {
emitter.onError(new Throwable("请求失败"));
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
} /**
* 添加头部请求参数
*
* @param headerParamsMap
* @return
*/ public static ArrayList<HeaderProperty> addHeadProperty(Map<String, Object> headerParamsMap) {
ArrayList<HeaderProperty> headerProperty = new ArrayList<>();
//添加head参数
if (headerParamsMap != null && headerParamsMap.size() > 0) {
Set<String> keys = headerParamsMap.keySet();
for (String headerKey : keys) {
Logger.i("参数");
Logger.i(headerKey + ":" + headerParamsMap.get(headerKey));
// request.addProperty(headerKey, headerParamsMap.get(headerKey));
headerProperty.add(new HeaderProperty(headerKey, (String) headerParamsMap.get(headerKey))); }
}
return headerProperty;
} }

3:我们在ViewModel中调用请求

        Map<String, Object> headParamsMap = new HashMap<>();
headParamsMap.put("XXX","XXX");
headParamsMap.put("XXX","XXX");
headParamsMap.put("XXX","XXX");
headParamsMap.put("XXX","XXX");
headParamsMap.put("XXX","XXX"); Map<String, Object> queryParamsMap = new HashMap<>();
queryParamsMap.put("XXX","XXX");
queryParamsMap.put("XXX","XXX");
queryParamsMap.put("XXX","XXX");
queryParamsMap.put("XXX","XXX"); homeResource.searchCusEvent(queryParamsMap, headParamsMap).subscribe(new SingleObserver() {
@Override
public void onSubscribe(Disposable d) {
} @Override
public void onSuccess(Object o) {
SoapSerializationEnvelope envelope = (SoapSerializationEnvelope) o;
//服务器返回的结果
Logger.i(envelope.getResponse());
} @Override
public void onError(Throwable e) {
Logger.i(e.getMessage());
}
}); public Single searchCusEvent(Map<String, Object> queryParamsMap, Map<String, Object> headerParamsMap) {
return SoapConfig.sendData(queryParamsMap, headerParamsMap);
}

4 解析请求WebService返回SoapObject 数据解析,我们可以按照约定的格式解析,虽然不太方便,但是暂时也没找到更好的资料或研究出更好的方法

try {
SoapSerializationEnvelope envelope = (SoapSerializationEnvelope) o;
Object ob = envelope.bodyIn;
SoapObject soapObject = (SoapObject) envelope.getResponse();
SoapObject str = (SoapObject) soapObject.getProperty(0);
SoapObject st1 = (SoapObject) soapObject.getProperty(1);
SoapObject str2 = (SoapObject) st1.getProperty(0);
List<SimpleType> lists = new ArrayList<>(); for (int i = 0; i < str2.getPropertyCount(); i++) {
SoapObject soapObject1 = (SoapObject) str2.getProperty(i);
lists.add(new SimpleType(Integer.parseInt(soapObject1.getPropertyAsString("RegionID")), soapObject1.getPropertyAsString("RegionName")));
}
Logger.d(String.valueOf(lists.size()));
} catch (SoapFault soapFault) {
soapFault.printStackTrace();
}

ksoap2 android 调用WebService的更多相关文章

  1. Android调用WebService(转)

    Android调用WebService WebService是一种基于SOAP协议的远程调用标准,通过 webservice可以将不同操作系统平台.不同语言.不同技术整合到一块.在Android SD ...

  2. 纠正网上乱传的android调用Webservice方法。

    1.写作背景: 笔者想实现android调用webservice,可是网上全是不管对与错乱转载的文章,结果不但不能解决问题,只会让人心烦,所以笔者决定将自己整理好的能用的android调用webser ...

  3. Android调用WebService

    这两天给老师做地铁app的demo,与后台的交互要用WebService,还挺麻烦的.所以想写点,希望有用. Web Services(Web服务)是一个用于支持网络间不同机器互操作的软件系统,它是一 ...

  4. 第十五章:Android 调用WebService(.net平台)

    什么是webservice? Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现.协调和 ...

  5. Android 调用webService(.net平台)

    什么是webservice? Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现.协调和 ...

  6. 【Android进阶】Android调用WebService的实现

    最近想自己搞搞服务器,就从最简单的webservice开始吧 先上效果图 项目结构 开始贴代码,注释都有,有问题的请留言 MainActivity.java package com.example.w ...

  7. 网摘Android调用WebService

    这边特别注意调用的.net WCF 接口的绑定方式.以前一直用的wxHttpbinding,一直连不上.改成BasicHTTPbinding就能连上了 上篇文章已经对Web Service及其相关知识 ...

  8. android调用webservice接口获取信息

    我的有一篇博客上讲了如何基于CXF搭建webservice,service层的接口会被部署到tomcat上,这一篇我就讲一下如何在安卓中调用这些接口传递参数. 1.在lib中放入ksoap2的jar包 ...

  9. Android 调用 WebService

    1.WebService简介 PS:如果看完上面简介还不是很清楚的话,那么就算了,之前公司就用C#搭的一个WebService! 本节我们并不讨论如何去搭建一个WebService,我们仅仅知道如何去 ...

随机推荐

  1. springboot执行延时任务-DelayQueue的使用

    DelayQueue简介 在很多场景我们需要用到延时任务,比如给客户异步转账操作超时后发通知告知用户,还有客户下单后多长时间内没支付则取消订单等等,这些都可以使用延时任务来实现. jdk中DelayQ ...

  2. go proxy athens 部署到k8s

    目录 go proxy athens 部署到k8s 一.athens简介 二.部署 1.创建 PersistentVolume 2.创建service 3.创建deployment 4.ci/cd中使 ...

  3. 【译】Visual Studio 2019 中 WPF & UWP 的 XAML 开发工具新特性

    原文 | Dmitry 翻译 | 郑子铭 自Visual Studio 2019推出以来,我们为使用WPF或UWP桌面应用程序的XAML开发人员发布了许多新功能.在本周的 Visual Studio ...

  4. word2vec用到的c语言知识

    argc,avgv用法 argc 表示有几个参数,因为至少要指定一个应用程序的名,所以argc>=1. argv表示参数是什么. int main(int argc, char **argv) ...

  5. 3- 设置断点修改Response

    以下是借鉴别人的知识分享.我在这里转载,如有冒犯,还请告知. 只要你会设置断点修改请求内容的话,这个设置断点修改响应内容的方法也是一样的,只需要修改一下命令即可. 修改响应内容也有两种方法: 第一种: ...

  6. 【Nodejs】392- 基于阿里云的 Node.js 稳定性实践

    前言 如果你看过 2018 Node.js 的用户报告,你会发现 Node.js 的使用有了进一步的增长,同时也出现了一些新的趋势. Node.js 的开发者更多的开始使用容器并积极的拥抱 Serve ...

  7. HashMap面试必问的6个点,你知道几个?

    一.HashMap的实现原理? 此题可以组成如下连环炮来问 你看过HashMap源码嘛,知道原理嘛? 为什么用数组+链表? hash冲突你还知道哪些解决办法? 我用LinkedList代替数组结构可以 ...

  8. Ubuntu修改时间

    Ubuntu修改时区和更新时间 先查看当前系统时间 date -R 结果时区是:+0000 我需要的是东八区,这儿显示不是,所以需要设置一个时区 运行 tzselect 在这里我们选择亚洲 Asia, ...

  9. NodeJS2-4环境&调试----global变量

    global全局对象,希望把全局访问到的对象,属性和方法等挂到global对象上,除了用户自定义的方法外,global本身默认带着一些常用的属性和方法的 CommonJS Buffer.process ...

  10. java基础-谈谈你对面向对象的理解

    一 前言 本篇文章的核心知识如下,主要是帮助大家更好的理解面向对象编程: 二面向对象VS面向过程 2.1 面向过程编程 面向过程编程(Process Oriented Programming )其意指 ...