Android程序使用SOAP调用远程WebService服务

在如今的应用程序中,不可能不使用到网络,并且后台一定是有服务器作为支撑的。如今最常见的调用方式有HTTP的GET ,POST方式,返回JSON或者XML数据。但是也有一种常见的形式就是调用WebService。现在我们来实现一下在Android端使用SOAP简单对象访问协议来调用WebService数据。主要的需求是根据某个手机号码返回这个号码的运营商,卡类型以及归属地等信息。

(1)先从网上下载一个ksoap的jar包,放入项目的libs文件夹下,我也提供百度网盘的下载:http://pan.baidu.com/s/1o6svnC2    。

(2)推荐一个可以调用WebService的网站,上面提供了很多的服务,http://www.webxml.com.cn/zh_cn/index.aspx   。

(3)在Activity中的实现的代码如下:主要做界面显示操作,并初始化一些WebService调用的参数,如URL地址,命名空间,方法名称,参数列表等。

package com.example.testwebservice2;

import java.util.HashMap;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class WebserviceActivity extends Activity {

	private Context context;

	private static final String URL = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx";// 请求的url
	private static final String NAMESPACE = "http://WebXml.com.cn/";// 请求的命名空间;
	private static final String METHODNAME = "getMobileCodeInfo"; // 方法名称,获得国内手机号码归属地省份,地区和手机卡类型信息;
	private EditText phoneNum;
	private Button query;
	private TextView showResult;

	private Handler handler = new Handler() {// 刷新界面;
		public void handleMessage(Message msg) {
			String myData = msg.getData().getString("data");// 这里是完全解析好后的数据;用于显示;
			if (myData != null || !"".equals(myData)) {
				showResult.setText(myData);
			}
		};
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		this.context = this;
		initView();
		query.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				// 手机号码(段)
				String phoneSec = phoneNum.getText().toString().trim();
				// 简单判断用户输入的手机号码(段)是否合法
				if ("".equals(phoneSec) || phoneSec.length() < 7) {// 输入不合法;
					phoneNum.setError("您输入的手机号码(段)有误!"); // 给出错误提示
					phoneNum.requestFocus();
					// 将显示查询结果的TextView清空
					phoneNum.setText("");
					return;
				}
				ResponseOnClick(); // 输入没问题,开始请求数据;
			}
		});
	}

	private void initView() {
		phoneNum = (EditText) findViewById(R.id.phone_sec);
		query = (Button) findViewById(R.id.query_btn);
		showResult = (TextView) findViewById(R.id.result_text);
	}

	private void ResponseOnClick() {
		HttpThread thread = new HttpThread(handler, context);
		HashMap<String, Object> params = new HashMap<String, Object>();
		String phoneSec = phoneNum.getText().toString().trim();// 电话号码;
		params.put("mobileCode", phoneSec);// mobileCode:字符串,手机号码,最少前七位数字;
		params.put("userId", "");// 字符串,免费用户为空字符串;
		thread.doStart(URL, NAMESPACE, METHODNAME, params);
	}

}

(4)新建一个线程类,继承自Thread,主要做访问WebService的网络操作。接收返回的数据并传递给Activity。

package com.example.testwebservice2;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;

import android.app.ProgressDialog;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

class HttpThread extends Thread {
	private Handler handler = null;
	private Context context = null;
	private String url = null;
	private String namespace = null;
	private String methodName = null;
	HashMap<String, Object> params = new HashMap<String, Object>();// 参数列表;
	private ProgressDialog progressDialog = null;

	// 构造函数
	public HttpThread(Handler handler, Context context) {
		this.handler = handler;
		this.context = context;
	}

	/**
	 * 启动线程
	 */
	/**
	 * 要向服务器传递的四个参数分别是: (1)URL (2)命名空间 (3)方法名 (4)参数列表
	 *
	 * @param url
	 * @param namespace
	 * @param methodName
	 * @param params
	 */
	public void doStart(String url, String namespace, String methodName,
			HashMap<String, Object> params) {
		this.url = url;
		this.namespace = namespace;
		this.methodName = methodName;
		this.params = params;
		progressDialog = ProgressDialog.show(context, "提示", "正在请求请稍等...", true);
		this.start();// 启动这个线程;
	}

	/**
	 * 线程运行
	 */
	@Override
	public void run() {
		try {
			// web service 请求
			SoapObject result = (SoapObject) CallWebService();
			Log.i("HttpThread_getPropertyCount", result.getPropertyCount() + "");
			Log.i("HttpThread_getProperty(0)", result.getProperty(0) + "");
			// 构造数据
			String value = null;
			if (result != null && result.getPropertyCount() > 0) {
				for (int i = 0; i < result.getPropertyCount(); i++) {
					SoapPrimitive primitive = (SoapPrimitive) result
							.getProperty(i);
					value = primitive.toString();
				}
				/**
				 * 这里获得的value就是WebService的值: 18710498511:陕西 西安 陕西移动全球通卡
				 */
				// Log.i("HttpThread_value", value);
				// 取消进度框
				progressDialog.dismiss();
				// 构造消息
				Message message = handler.obtainMessage();
				Bundle bundle = new Bundle();
				bundle.putString("data", value);// 传递到界面进行显示;
				message.setData(bundle);
				handler.sendMessage(message);// 传递到到Activity的handmessage()中进行处理;
			}// if
		} catch (Exception e) {
			e.printStackTrace();
		}
	}// run();

	private Object CallWebService() {
		String SOAP_ACTION = namespace + methodName;// 命名空间+方法名称;
		SoapObject request = new SoapObject(namespace, methodName);// 创建SoapObject实例
		// 生成调用web service 方法的soap请求消息
		SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
				SoapEnvelope.VER11);
		// 设置.net web service
		envelope.dotNet = true;

		// 请求参数
		if (params != null && !params.isEmpty()) {
			for (Iterator it = params.entrySet().iterator(); it.hasNext();) {
				Map.Entry<String, Object> e = (Entry) it.next();
				request.addProperty(e.getKey().toString(), e.getValue());
			}
		}
		// 发送请求
		envelope.setOutputSoapObject(request);
		HttpTransportSE transport = new HttpTransportSE(url);
		SoapObject result = null;
		try {
			// web service请求
			transport.call(SOAP_ACTION, envelope);
			result = (SoapObject) envelope.bodyIn;
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		Log.i("result", result.toString());
		return result;
	}// CallWebService();
}// HttpThread类;

(5)程序运行结果如图:

.

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 01:20:05

Android程序使用SOAP调用远程WebService服务的相关文章

Node.js 使用 soap 模块请求 WebService 服务接口

项目开发中需要请求webservice服务,前端主要使用node.js 作为运行环境,因此可以使用soap进行请求. 使用SOAP请求webservice服务的流程如下: 1.进入项目目录,安装 soap 模块 > npm install soap --save-dev 2.在项目的 node_modules 目录下找到soap模块下的 lib > client.js, 修改代码: soapAction = ((ns.lastIndexOf("/") !== ns.leng

使用Spring Cloud Feign作为HTTP客户端调用远程HTTP服务

如果你的项目使用了SpringCloud微服务技术,那么你就可以使用Feign来作为http客户端来调用远程的http服务.当然,如果你不想使用Feign作为http客户端,也可以使用比如JDK原生的URLConnection.Apache的Http Client.Netty的异步HTTP Client或者Spring的RestTemplate. 那么,为什么我们要使用Feign呢? 首先我们的项目使用了SpringCloud技术,而Feign可以和SpringCloud技术无缝整合.并且,你一

VS2008非托管C++调用wcf(WebService)服务

在Visual Studio 2008以及以后版本中,微软停止了非托管C++的直接WebService引用.不过ATL Server代码已经托管到开源网站上,我们可以找到ATL Server的源代码,编译出Sproxy.exe,这个工具可以根据wsdl文件来生成非托管的代理类.这个代理类还需要配合一些头文件才能一起使用,这个相关的头文件都包含在ATL Server的源代码内. 1.第一步需要使用sproxy.exe工具来生成代理类.在vs2008以前的版本,比如vs2005,本身就带有这个命令,

WebService自己创建服务或调用第三方webservice服务

一,自己创建webservice服务 首先创建一个项目,目录结构如下 HelloService.java 文件如下 package com.joydo.cn; import javax.jws.WebService; import javax.xml.ws.Endpoint; @WebService public class HelloService {   public String getValue(String name){   return  "我的名字叫"+name;    

PHP写webservice服务端

1) WebService技术介绍 WebService是一种跨编程语言和跨操作系统平台的远程调用技术.仅仅有通过Web Service,client和server才可以自由的用HTTP进行通信.不论两个程序的平台和变成语言是什么. XML.SOAP和WSDL是Web Service平台的三大技术: WebService採用HTTP协议数据传输.採用XML格式封装数据,即XML中说明调用远程服务对象的哪个方法.传递的參数是什么.以及服务对象的返回结果是什么. XML是WebService平台中表

使用CXF发布webservice服务及注意要点

一.概念 1.什么是webservice Web service是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式的互操作的应用程序. 2.wsdl 网络服务描述语言是一个用来描述Web服务和说明如何与Web服务通信的XML(标准通用标记语言的子集)语言.为用户提供详细的接口说明书. 3.soap 简单对象访问协议是交换数据的一种协议规范,是一种轻量的.简单的.基于XML(标准通用标记语言下的一个子

如何在SpringMVC项目中部署WebService服务并打包生成客户端

场景 某SpringMVC项目原本为一个HTTP的WEB服务项目,之后想在该项目中添加WebService支持,使该项目同时提供HTTP服务和WebService服务.其中WebService服务通过 /ws/** 地址拦截. 配置 通过配置让SpringMVC支持WebService. 依赖 首先通过Maven引入必要依赖包. org.apache.cxf org.apache.neethi com.ibm.wsdl4j org.apache.XmlSchema Web.xml 通过配置Web

C#程序员学习Android开发系列之调用WebService

我在学习Android开发过程中遇到的第一个疑问就是Android客户端是怎么跟服务器数据库进行交互的呢?这个问题是我当初初次接触Android时所困扰我的一个很大的问题,直到几年前的一天,我突然想到WebService是否可以呢?让WebService充当服务器端的角色,完成与服务器数据库操作相关的事情,而Android客户端只要按照WebService方法参数的要求去调用就行了.在当时我对这个解决方案的实现还没模糊,我想这个问题也是初学Android的朋友肯定会想到的问题.那么现在就让我们动

java程序调用xfire发布的webService服务(二)

在上一篇的调用xfire发布的webService服务中,我只是从服务端返回了一个字符串给客户端,却没有测试从客户端传递数据给服务端.而实际应用中一般是不太可能只出现这样的应用场景的,因此我便更进一步测试了客户端传递数据给服务端. 因为相关的jar包在上一篇已经说过,因此便不再重复说明,这次的测试步骤如下: 一.测试向服务端传递字符串(重点在第二个): 为了进一步理解服务搭建,我重新写了一个服务端服务类: 接口: package xfireTest; public interface XFire