Android程序使用SOAP调用远程WebService服务
在现在的应用程序中。不可能不使用到网络,而且后台一定是有server作为支撑的。
现在最常见的调用方式有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;
} /**
* 启动线程
*/
/**
* 要向server传递的四个參数各自是: (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)程序执行结果如图:
..
github主页:https://github.com/chenyufeng1991 。欢迎大家訪问!
Android程序使用SOAP调用远程WebService服务的更多相关文章
- PDA(Windows Mobile)调用远程WebService
之前用模拟器测试过调用远程的WebService,发现总是提示"无法连接到远程服务器"的错误,不管是Windows Mobile6.0 还是6.5都是一样,按照网上的办法,改注册表 ...
- Node.js 使用 soap 模块请求 WebService 服务接口
项目开发中需要请求webservice服务,前端主要使用node.js 作为运行环境,因此可以使用soap进行请求. 使用SOAP请求webservice服务的流程如下: 1.进入项目目录,安装 so ...
- VS2008非托管C++调用wcf(WebService)服务
在Visual Studio 2008以及以后版本中,微软停止了非托管C++的直接WebService引用.不过ATL Server代码已经托管到开源网站上,我们可以找到ATL Server的源代码, ...
- spring cloud 声明式rest客户端feign调用远程http服务
在Spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端.Feign就是Spring Cloud提供的一种声明式R ...
- [转]C# WinForm动态调用远程Web服务
本文转自:http://blog.csdn.net/muyangjun/article/details/7930871 1.添加服务引用 2.在弹出的添加服务引用对话框地址栏中输入WebService ...
- C# WinForm动态调用远程Web服务
本文转自:http://blog.csdn.net/muyangjun/article/details/7930871 1.添加服务引用 2.在弹出的添加服务引用对话框地址栏中输入WebService ...
- 使用Spring Cloud Feign作为HTTP客户端调用远程HTTP服务
在Spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端.我们可以使用JDK原生的URLConnection.Ap ...
- spring Cloud Feign作为HTTP客户端调用远程HTTP服务
在Spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,因此在调用远程服务时就必须使用HTTP客户端.我们可以使用JDK原生的URLConnection.Ap ...
- 命令行调用远程dubbo服务
有时需要对dubbo服务做个简单的测试,或者想看下某个dubbo服务类所提供的方法,可以直接在命令行通过telnet的方式来查看和调用dubbo服务,方法如下: telnet 127.0.0.1 20 ...
随机推荐
- Java基础学习总结(27)——7 款开源 Java 反编译工具
今天我们要来分享一些关于Java的反编译工具,反编译听起来是一个非常高上大的技术词汇,通俗的说,反编译是一个对目标可执行程序进行逆向分析,从而得到原始代码的过程.尤其是像.NET.Java这样的运行在 ...
- POJ 2081 Recaman's Sequence
Recaman's Sequence Time Limit: 3000ms Memory Limit: 60000KB This problem will be judged on PKU. Orig ...
- 四 HBase 客户端设置缓存优化查询。
其实查询无非是一个 HBase 的 RPC 计算公式 .然后给API 提供值. RPCs = (Rows * Cols per Row) / Min(Cols per Row, Batch Size) ...
- Watcher详解 工作机制, Watcher客户端注册、Watcher 服务端注册
Watcher详解.接口 在 ZooKeeper 中, 接口类 Watcher 用于表示一个标注你的事件处理器,其定义了事件通知相关的逻辑,包含 KeeperState 和 EventType 两个枚 ...
- 存储过程和transaction
https://stackoverflow.com/questions/11531352/how-to-rollback-a-transaction-in-a-stored-procedure BEG ...
- HDU 5371 Hotaru's problem Manacher+尺取法
题意:给你一个序列,求最长的两段回文子串,要求他们共用中间的一半. 思路:利用Manacher求出p[i]表示的当前位置的最长回文串长度,然后把每一个长度大于等于2的回文串的左区间和右区间分别放到两个 ...
- Linux下CD/DVD刻录软件
1.Brasero是一款CD/DVD刻录软件,Gnome桌面环境默认自带,支持单次写入数据DVD和任何类型的CD,并且能够将光盘镜像写入到硬盘,其图形化的操作界面使用户能够轻松而快速的在Linux下烧 ...
- 手把手教你在VMware虚拟机中安装Ubuntu14.04系统
在VMware中创建完虚拟机之后,一般需要给虚拟机安装系统,比较受青睐的系统有Ubuntu和Centos,关于Centos系统的安装之前已经写过了,感兴趣的小伙伴可以戳这篇文章:靠谱的centos7. ...
- du---是对文件和目录磁盘使用的空间查看
du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的. 语法 du [选项][文件] 选项 -a或-all 显示目录中个 ...
- 兼容IE浏览器的canvas画线和圆圈
1.新建test.html文件,代码如下: <!DOCTYPE html><html><head> <meta charset="utf-8& ...