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. Linux内核最顶层文档

    Linux 内核文档 该文件是 Linux 内核文档树中最顶层的,会随着内核一起更新:其目的是把散乱的文档集成为一个逻辑清晰的完整版,非常欢迎改善文档,如果想做出自己的贡献,加入vger.kernel ...

  2. 智能家居CC2530功率放大组网RFX2401C和AT2401C的区别

    两者最大的区别就是RFX2401C的增益为12dbmAT2401C的增益为14dbm这就会导致AT2401C的功耗会比RFX2401C大一点点,但距离也会相对更远,并且增加了EDS防静电等级,多出2个 ...

  3. Creating your first iOS Framework

    转自:https://robots.thoughtbot.com/creating-your-first-ios-framework If you’ve ever tried to create yo ...

  4. 【数据结构05】红-黑树基础----二叉搜索树(Binary Search Tree)

    目录 1.二分法引言 2.二叉搜索树定义 3.二叉搜索树的CRUD 4.二叉搜索树的两种极端情况 5.二叉搜索树总结 前言 在[算法04]树与二叉树中,已经介绍过了关于树的一些基本概念以及二叉树的前中 ...

  5. 《项目实战》从Spring开始说起

    引导 从今天开始,我们正式进入项目实战系列,我们会从项目架构的搭建,以及如何解决三高问题(高并发.高可用.高性能),源码会同步进行更新,欢迎大家持续关注 https://gitee.com/liupa ...

  6. java web项目war包部署,使用tomcat对指定接口设置身份认证

    先简单说一下需求: 将一个基于springboot2.0开发的java web项目打成war包,通过tomcat部署到一台linux服务器上,项目相关的一些图片等资源也按照一定规则放置在服务器构建好的 ...

  7. Spring Boot (二) 整合 Redis

    前言 本文将会基于 springboot 2.1.8.RELEASE 简单整合 Redis ,适合新手小白入门 Spring Boot 整合 Redis 入门 1.pom.xml 中引入 redis ...

  8. OS OSTEP (Operating Systems Three Easy pieces 操作系统导论 )

    读<OSTEP>的一点重点记录与感悟 (未完) Chapter-2 第二章 1. 操作系统的设计目标:  抽象.高性能.保护.不间断运行. 抽象:建立一些“抽象”,让操作系统方便和易于使用 ...

  9. 数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?

    下面列出了Array和ArrayList的不同点:Array可以包含基本类型和对象类型,ArrayList只能包含对象类型.Array大小是固定的,ArrayList的大小是动态变化的.ArrayLi ...

  10. 搞懂toString()与valueOf()的区别

    一.toString() 作用:toString()方法返回一个表示改对象的字符串,如果是对象会返回,toString() 返回 “[object type]”,其中type是对象类型. 二.valu ...