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,我们仅仅知道如何去 ...
随机推荐
- 创建自己的github仓库
作者: wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/20067595 一.创建自己的github仓库 CocoaPods都托 ...
- MyBatis三个查询方法_selectList_selectOne_selectMap
mybatis-cfg.xml的配置: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE co ...
- Mybatis动态查询
需要导入的jar包: 实体类User: package com.bjsxt.pojo; import java.io.Serializable; public class User implement ...
- hdu2199,double二分
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2199 题意:给一个Y,求满足8*x^4 + 7*x^3 + 2*x^2 + 3*x + 6 == Y的 ...
- css Backgroud-clip (文字颜色渐变)
首先来瞄一下background-clip,这个属性是干嘛的? 顾名思义,背景裁剪... 按照我自己的理解就是背景的显示区域 此处粘上MDN的示例链接(嫌麻烦的,后面我也贴上截图)https:// ...
- C语言之推箱子游戏代码
前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:Yan_Less 正文 新手注意:如果你学习遇到问题找不到人解答,可以点 ...
- 用FPGA设计LCD 转 VGA
这个东西其实是在上一个冬天就做完了,而且似乎已经产业化了,当时是为一位朋友做的,这个朋友再卖给产业化的人,就像流于俗套的故事一样,这个朋友拿到了钱,不过不像项目开始时说的那样与我有关.想想多年前一起吃 ...
- java面向对象基础知识
一.面向对象与面向过程的区别: ①所处的角色不同:前者指挥者,后者执行者:②所需知道的事情不同:前者知道哪些是做这些事情的人就可以,不需了解具体的事情操作的过程.后者需要具备应有的技能来做这些事情. ...
- 【MobX】390- MobX 入门教程(上)
点击上方"前端自习课"关注,学习起来~ 本文考虑到篇幅问题,将<MobX 入门教程>分成上.下两篇文章,方便阅读.分配安排: 一.MobX 介绍 首先看下官网介绍: ★ ...
- 关于页面打印window.print()的样式问题
当我们打印网页的时候.有时候会发现.打印出来的.跟网页上看到的样式的差别有点大.这其中可能有的问题是.样式问题. 当调用打印(window.print())方法时.打印机会在网页的样式中查找 @med ...