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,我们仅仅知道如何去 ...
随机推荐
- Sql Server连表查询字段为null
这是一个坑,并且是有毒的坑. 一不小心我就掉进了这个坑里面,费了好大的力气这才从坑里面爬出来. 话不多说,开始吹BB啦. 一.简单说说遇到的问题: 连表查询,一对多. 出现 int, smallda ...
- MyBatis—resultMap 的关联方式实现多表查询(多 对一)
mapper 层 a)在 StudentMapper.xml 中定义多表连接查询 SQL 语句, 一次性查到需要的所有数据, 包括对应班级的信息. b)通过<resultMap>定义映射关 ...
- Cannot forward after response has been committed问题的解决
Cannot forward after response has been committed问题解决及分析 通过TOMCAT把系统启动,可以正常登陆门户,登陆进去选择子系统的时候点击登陆的时候,可 ...
- Nginx目录结构与配置文件详解
Nginx安装 具体安装nginx请移步:[nginx部署] 安装依赖 安装pcre依赖软件 [root@ubuntu ~]# yum install -y pcre pcre-devel //外网情 ...
- Elasticsearch logstash filter
参照官方文档: https://www.elastic.co/guide/en/logstash/current/advanced-pipeline.html demo-pipeline.conf i ...
- CSU oj 2092-Space Golf
You surely have never heard of this new planet surface exploration scheme, as it is being carried ou ...
- MySQL面试总结
MySQL面试总结 # MySQL的存储引擎 `MyISAM`(默认表类型):非事务的存储引擎,基于传统的`ISAM`(有索引的顺序访问方法)类型,是存储记录和文件的标准方法,不是事务安全,不支持外键 ...
- BX谷 2019年最新所有人都能学会的数据分析课视频教程
第一章 数据分析师职业概览 1-1 数据分析师的职业概览免费试学 数据分析师的"钱"景如何 什么人适合学数据分析 数据分析师的临界知识 数据分析师的主要职责 第二章 数据分析和数据 ...
- 基于iCamera测试高清摄像头OV7725小结
基于iCamera测试高清摄像头OV7725小结 先看看硬件特点 然后看看硬件测试,usb采集出图 默认是不带晶振的,可以通过usb提供提供12M.24M.48M时钟 软件出图 可以通过修改0x11, ...
- 【CuteJavaScript】Angular6入门项目(1.构建项目和创建路由)
本文目录 一.项目起步 二.编写路由组件 三.编写页面组件 1.编写单一组件 2.模拟数据 3.编写主从组件 四.编写服务 1.为什么需要服务 2.编写服务 五.引入RxJS 1.关于RxJS 2.引 ...