ksoap2 android 调用WebService
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的更多相关文章
- Android调用WebService(转)
Android调用WebService WebService是一种基于SOAP协议的远程调用标准,通过 webservice可以将不同操作系统平台.不同语言.不同技术整合到一块.在Android SD ...
- 纠正网上乱传的android调用Webservice方法。
1.写作背景: 笔者想实现android调用webservice,可是网上全是不管对与错乱转载的文章,结果不但不能解决问题,只会让人心烦,所以笔者决定将自己整理好的能用的android调用webser ...
- Android调用WebService
这两天给老师做地铁app的demo,与后台的交互要用WebService,还挺麻烦的.所以想写点,希望有用. Web Services(Web服务)是一个用于支持网络间不同机器互操作的软件系统,它是一 ...
- 第十五章:Android 调用WebService(.net平台)
什么是webservice? Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现.协调和 ...
- Android 调用webService(.net平台)
什么是webservice? Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现.协调和 ...
- 【Android进阶】Android调用WebService的实现
最近想自己搞搞服务器,就从最简单的webservice开始吧 先上效果图 项目结构 开始贴代码,注释都有,有问题的请留言 MainActivity.java package com.example.w ...
- 网摘Android调用WebService
这边特别注意调用的.net WCF 接口的绑定方式.以前一直用的wxHttpbinding,一直连不上.改成BasicHTTPbinding就能连上了 上篇文章已经对Web Service及其相关知识 ...
- android调用webservice接口获取信息
我的有一篇博客上讲了如何基于CXF搭建webservice,service层的接口会被部署到tomcat上,这一篇我就讲一下如何在安卓中调用这些接口传递参数. 1.在lib中放入ksoap2的jar包 ...
- Android 调用 WebService
1.WebService简介 PS:如果看完上面简介还不是很清楚的话,那么就算了,之前公司就用C#搭的一个WebService! 本节我们并不讨论如何去搭建一个WebService,我们仅仅知道如何去 ...
随机推荐
- Redis 命令执行过程(下)
在上一篇文章中<Redis 命令执行过程(上)>中,我们首先了解 Redis 命令执行的整体流程,然后细致分析了从 Redis 启动到建立 socket 连接,再到读取 socket 数据 ...
- HDU1529-Casher Emploryment(最最...最经典的差分约束 差分约束-最长路+将环变线)
A supermarket in Tehran is open 24 hours a day every day and needs a number of cashiers to fit its n ...
- Mysql基础03-函数
函数 字符串函数 函数 用法 CONCAT(S1,S2,......,Sn) 连接S1,S2,......,Sn为一个字符串 CONCAT_WS(s, S1,S2,......,Sn) 同CONCAT ...
- 基于iCamera测试高清摄像头OV7725小结
基于iCamera测试高清摄像头OV7725小结 先看看硬件特点 然后看看硬件测试,usb采集出图 默认是不带晶振的,可以通过usb提供提供12M.24M.48M时钟 软件出图 可以通过修改0x11, ...
- linux-touch 、mkdir、rm、pwd、which、locate、whatis
1.touch: 创建空文件,修改文件时间戳信息 atime(access time):最近访问文件内容时间 mtime(modify time):最近修改文件内容时间 ctime(change ti ...
- Day 09 作业
简述定义函数的三种方式 有参函数, 无参函数, 空函数 简述函数的返回值 函数内部代码经过一系列的逻辑处理返回的结果 简述函数的参数 函数的参数分形参和实参 形参: 定义函数阶段, 括号内定义的参数, ...
- 【JS】388- 深入了解强大的 ES6 「 ... 」 运算符
本文原载于 SegmentFault 社区 专栏:大前端 作者:皮小蛋 背景 ... 运算符,是 ES6 里一个新引入的运算法,也叫 展开/收集 运算符,我们每天都要和它打交道. 这篇文章,我就带你 ...
- Linux搭建Java环境(JDK+Tomcat+MySQL)
目录 一.项目环境: 二.安装JDK1.8 三.安装Tomcat8.5 四.安装MySQL数据库 五.配置JAVA项目 一.项目环境: 开发环境 生产环境 测试环境 硬件环境: web服务器:cpu: ...
- matplotlib可视化最全指南
1. 折线图:plt.plot 设置数据:plt.plot(x,y),单列数据传入默认y轴,此时x轴数据默认从0逐渐对应递增 设置颜色:plt.plot(x,y,color/c=" &quo ...
- 牛客练习赛34 little w and Segment Coverage (差分区间)
链接:https://ac.nowcoder.com/acm/contest/297/C来源:牛客网 题目描述 小w有m条线段,编号为1到m. 用这些线段覆盖数轴上的n个点,编号为1到n. 第i条线段 ...