`

在Android中使用SOAP调用Webservice

 
阅读更多

Android中使用SOAP调用Webservice

介绍

如果使用SOAP进行访问Webservice

什么是SOAP

SOAPSimple Object Access Protocol)简单对象访问协议是交换数据的一种协议规范,是一种轻量的、简单的、基于XML(标准通用标记语言下的一个子集)的协议,它被设计成在WEB上交换结构化的和固化的信息。

WebService三要素:SOAPWSDL (Web Services Description Language)UDDI( Universal Description Discovery and Integration ), SOAP用来传递信息的格式, WSDL 用来描述如何访问具体的接口, UDDI用来管理,分发,查询webService 具体实现可以搜索 Web Services简单实例 ; SOAP 可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议(HTTP),简单邮件传输协议(SMTP),多用途网际邮件扩充协议(MIME)。它还支持从消息系统到远程过程调用(RPC)等大量的应用程序。SOAP使用基于XML的数据结构和超文本传输协议(HTTP)的组合定义了一个标准的方法来使用Internet上各种不同操作环境中的分布式对象。

以下为SOAP封装结构:

    
 

 

概述

对于Android访问远端的web Service,除了官方标准JSR 172,我们还有两种选择: 

— KSOAP2

— Wingfoot 

Wingfoot是由Wingfoot Software (www.wingfoot.com)出品的一款J2ME(CLDC/CDC) SOAP1.1的轻量级实现方案。

KSOAPEnhydra.org的一个开源作品,是EnhydraME项目的一部分。基于Enhydra.org出品的开源通用XML解析器kXMLkSOAP完成了J2ME/MIDP平台上的SOAP解析和调用工作。 

Stefan Haustein领导的KSOAP开发小组于2001517日推出了Alhpa版本。之后又经过了一年的开发,200266日推出的kSOAP 1.2支持了SOAP1.2规范。2003825日推出的kSOAP2,对SOAP序列化规范支持得更好了。

 

KSOAP2下载提示:

http://code.google.com/p/ksoap2-android/

 

KSOAP2改进了对Microsoft dotNET的兼容。现在也相对比较有影响力。

使用类来访问Webservice

1.org.ksoap2.serialization.SoapObject

SOAP结构的封装类。

方法

返回值

方法名

描述

SoapObject

addProperty(String name, Object value)

添加请求Webservice的参数

Object

getProperty(int index)

返回指定节点数据

int

getPropertyCount()

返回节点的条数

int

getAttributeCount()

节点属性个数

Object

getAttribute(int index)

返回指定属性的值

     

 

2. org.ksoap2.serialization.SoapSerializationEnvelope

属性

类型

属性名

描述

Boolean

dotNet

设置此变量为true兼容.Net-Services的默认编码

方法

返回值

方法名

描述

void

setOutputSoapObject(java.lang.Object soapObject)

分配对象的信封作为soap调用出站消息

3.org.ksoap2.transport.HttpTransportSE

方法

返回值

方法名

描述

void

call(java.lang.String SoapAction, SoapEnvelope envelope)

结合HTTP协议进行请求

 

KSOAP2提供了以下几种规范:

常量SoapEnvelope.VER10:对应于SOAP 1.0规范
常量SoapEnvelope.VER11:对应于SOAP 1.1规范
常量SoapEnvelope.VER12:对应于SOAP 1.2规范

SOAP信封结构:

               

 

测试:

一、新建一个SOAPAndroid项目。

二、ksoap2-android-assembly-3.1.1-jar-with-dependencies.jar引用到第三方库中,以便为项目提供服务器。

三、测试。

3.1 使用.net创建一个本地WebService,请求返回HelloWord

package com.fighter.test;

 

import java.util.Date;

 

import org.ksoap2.SoapEnvelope;

import org.ksoap2.serialization.SoapObject;

import org.ksoap2.serialization.SoapSerializationEnvelope;

import org.ksoap2.transport.HttpTransportSE;

 

import android.test.AndroidTestCase;

 

public class Test extends AndroidTestCase{

 

 

public void testSOAP(){

final String NAME_SPACE = "http://tempuri.org/";

final String SOAP_ACTION = "http://tempuri.org/HelloWorld";

final String URL = "http://192.168.1.190:8081/Service1.asmx";

final String METHOD = "HelloWorld";

 

SoapObject request = new SoapObject(NAME_SPACE, METHOD);

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapSerializationEnvelope.VER11);

envelope.setOutputSoapObject(request);

envelope.dotNet = true;

System.out.println("开始请求时间..." + new Date());

HttpTransportSE transport = new HttpTransportSE(URL);

transport.debug = true;

try {

transport.call(SOAP_ACTION, envelope);

} catch (Exception e) {

System.out.println("请求错误.");

}

 

if (envelope.bodyIn != null) {

System.out.println("1--------:");

SoapObject result1 = (SoapObject) envelope.bodyIn;

for (int i = 0; i < result1.getAttributeCount(); i++) {

System.out.println("对应的键:" + result1.getAttributeAsString(i));

}

for (int i = 0; i < result1.getPropertyCount(); i++) {

System.out.println("\t  " + result1.getProperty(i).toString());

}

}

 

System.out.println("请求结束:" + new Date());

}

}

 

响应结果:

 

 

 

 

 

 

 

 

3.2使用公用Webservice进行测试。

地址:http://webservice.webxml.com.cn

测试根据省级编号查找市级信息。

Wsdlhttp://webservice.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl

四川省id31123

方法名:getSupportCityDataset

   

 

 

请求和响应的格式

测试代码:

 

static final String TAG = "SOAP_TEST";

	// 获取城市列表
	public void testGetSupportCityDataset() {
		final String CITY_ID = "31123"; // 四川id
		final String NAME_SPACE = "http://WebXml.com.cn/";
		final String SAOP_ACTION = "http://WebXml.com.cn/getSupportCityDataset";
		final String URL = "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx";
		final String METHOD = "getSupportCityDataset";

		SoapObject request = new SoapObject(NAME_SPACE, METHOD);
		request.addProperty("theRegionCode", CITY_ID);

		SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
				SoapEnvelope.VER11);
		envelope.setOutputSoapObject(request);
		envelope.dotNet = true;

		HttpTransportSE transport = new HttpTransportSE(URL);
		try {
			transport.debug = true;
			transport.call(SAOP_ACTION, envelope);
			// Log.v(TAG, "request:" + transport.requestDump);
			// Log.v(TAG, "response:" + transport.responseDump);
		} catch (Exception e) {
			Log.e(TAG, "response错误", e);
		}

		SoapObject response = (SoapObject) envelope.bodyIn;
		if (response != null) {
			// Log.v(TAG, "返回数据:" + response.toString());
			SoapObject result = (SoapObject) response.getProperty(0);
			Log.v(TAG, "result 节点数:" + result.getPropertyCount());
			// SoapObject dataSet = (SoapObject) result.getProperty(0);
			// Log.v(TAG, "显示数据:" + dataSet.getPropertyAsString(0));
			// SoapObject schema = (SoapObject) result.getProperty("schema");
			// Log.v(TAG, "schema id = " + schema.getAttribute("id"));

			if (result.getPropertyCount() >= 2) {
				SoapObject diffgram = (SoapObject) result.getProperty(1);
				if (diffgram.getPropertyCount() >= 1) {
					SoapObject region = (SoapObject) diffgram.getProperty(0);
					for (int i = 0; i < region.getPropertyCount(); i++) {
						try {
							Log.d(TAG,
									""
											+ City.parse((SoapObject) region
													.getProperty(i)));
						} catch (Exception e) {
							e.printStackTrace();
							Log.e(TAG, "错误", e);
						}
					}
				}
			}
		}
	}

	static class City {
		String id;
		String rowOrder;
		int cityId;
		String cityName;

		static City parse(SoapObject cityElement) throws Exception {
			City city = new City();
			try {
				city.id = cityElement.getAttributeAsString("id");
				city.rowOrder = cityElement.getAttributeAsString("rowOrder");
				city.cityId = Integer.parseInt(cityElement
						.getPropertyAsString("CityID"));
				city.cityName = cityElement.getPropertyAsString("CityName");
			} catch (Exception e) {
				throw e;
			}

			return city;
		}

		@Override
		public String toString() {
			return "id:" + id + "\n" + "rowOrder:" + rowOrder + "\n" + cityId
					+ " - " + cityName;
		}
	}

 

 

 

<!--EndFragment-->
  • 大小: 61.7 KB
  • 大小: 30 KB
  • 大小: 9.4 KB
  • 大小: 11.4 KB
分享到:
评论

相关推荐

    Android调用WebService

    在Android开发中,调用WebService是一项常见的任务,用于让移动应用与远程服务器进行数据交互。WebService通常基于HTTP协议,提供XML、JSON等格式的数据交换,使得不同平台的应用能够共享服务。本文将深入探讨如何在...

    delphi XE5 ANDROID平台 调用 webservice并访问操作MSSQL数据库

    然而,在 Android 平台上调用 Webservice 并访问操作 MSSQL 数据库是一个复杂的任务,本文将为您详细介绍如何使用 Delphi XE5 来实现这一目标。 一、服务端开发 服务端开发是指在服务器上创建一个 Webservice,...

    android平台调用webservice

    在Android中,使用SOAP调用Web服务主要涉及以下几个关键知识点: 1. **理解SOAP协议**:SOAP消息是基于XML格式的,包含头(Header)、体(Body)两部分。体部分通常包含一个方法调用,而头部分可以包含认证、交易等...

    Soap方式调用WebService

    3. **SOAP调用流程** - **创建SOAP消息**:客户端根据服务的WSDL(Web Service Description Language)文档,构造符合SOAP规范的请求消息。 - **发送请求**:客户端通过HTTP协议将SOAP消息发送到服务端的指定URL。...

    Android 基于 Retrofit2+Okhttp3 通过SOAP协议请求WebService.zip

    要在Android应用中使用Retrofit2和OkHttp3进行SOAP请求,我们需要以下步骤: 1. 添加依赖:首先在项目的build.gradle文件中添加Retrofit2和OkHttp3的依赖项。 ```groovy dependencies { implementation '...

    java android 调用webservice

    本篇将详细讲解如何在Android应用中使用Java调用Webservice。 一、理解Web服务 Web服务是一种基于互联网的、标准化的服务交互方式,它允许不同系统之间的应用程序共享数据和功能。常见的Web服务有SOAP(Simple ...

    Android调用webservice进行实体对象的传递Json

    本文将探讨如何在Android中调用WebService并使用JSON来安全地传输实体对象。首先,我们依赖于两个类库:ksoap2-android-assembly-2.5.4-jar-with-dependencies.jar用于Android端,而Newtonsoft.Json.dll则用于服务端...

    android 调用 Webservice源码

    本教程主要涉及如何在Android端调用Webservice服务,通过提供的源码实现基础的数学运算,如加、减、乘、除,并对相关技术进行详细解释。 1. **Android与Web服务的通信方式** Android调用Webservice主要依赖于HTTP...

    android调用webservice接口实现登陆源码

    本教程将深入探讨如何在Android中实现调用WebService接口进行登录功能,并基于提供的"login"源码进行分析。 首先,了解基础概念: 1. Android:Google开发的开源移动操作系统,主要应用于智能手机和平板电脑。 2. ...

    android端基于soap协议的webservice接口的调用demo

    在这个示例中,我们展示了如何在Android应用中使用KSOAP2库调用SOAP协议的Web Service接口。请注意,实际应用中可能需要根据具体的服务接口调整请求参数和处理响应的方式。同时,确保正确处理网络权限和异常情况,以...

    Android axis调用Webservice

    本文将详细介绍如何在Android应用中利用Axis2来调用Web Service。 **一、Android与Web Service交互基础** 1. **SOAP(Simple Object Access Protocol)**: 是一种轻量级的协议,用于交换结构化的和类型化的信息。...

    安卓调用WebService服务对返回的xml解析展示

    终于调通安卓调用Webservice,传参并解析XML的样例,使用工具:Android Studio和Eclipse.Eclipse启动WebServer,Android Studio进行Application编码调试。两个工程文件都在压缩包中。喜极而泣。。。

    Android 基于 Retrofit2+Okhttp3 通过SOAP协议请求WebService

    在Android开发中,与远程服务器进行数据交互是常见的需求,其中SOAP(Simple Object Access Protocol)协议是一种常用的Web Service通信标准,尤其在企业级应用中广泛使用。本教程将重点讲解如何利用Retrofit2和...

    android 调用.net webservice

    接下来,在应用程序中使用`AsmxUtil`类来调用WebService。具体步骤如下: - 创建`AsmxUtil`实例,并传入WebService的URL和服务方法名。 - 使用`AddProperty`方法添加请求参数。 - 调用`Call`方法执行请求。 ```...

    Android调用Webservice使用的ksoap2包

    总结,Ksoap2为Android开发者提供了一种简单的方式来调用.NET WebService,通过构建SOAP请求和解析响应,使得跨平台通信变得容易。然而,随着技术的发展,越来越多的Android应用倾向于使用基于JSON的RESTful API,...

    Android之Webservice详解与调用天气预报Webservice完整实例

    在调用Webservice时,通常会使用这些API来构建HTTP请求并解析返回的XML或JSON数据。 3. **Ksoap2库**:Ksoap2是一个轻量级的Android库,专门用于调用SOAP Web Services。在本实例中,我们将使用Ksoap2来与天气预报...

    在Android中调用C#写的WebService(附源代码).rar

    在Android端,我们将使用KSOAP2库来调用SOAP协议的Web Service,因为C# WebService通常使用SOAP作为默认通信协议。KSOAP2是一个轻量级的开源库,专为Android设计,用于处理SOAP请求和响应。首先,需要将ksoap2-...

Global site tag (gtag.js) - Google Analytics