【转】Android开发教程 --- Android调用WS
原文地址:http://www.cnblogs.com/jasoncc/archive/2011/12/23/2297950.html
Hi,大家好!
上节我们搭建了Java版的WS,那么在Android客户端上如何去访问呢?这将是我们这节需要涉及到的知识点。
照例,轻松一下:
一个年轻的程序员和一个项目经理登上了一列在山里行驶的火车,他们发现列车上几乎都坐满了,只有两个在一起的空位,这个空位的对面是一个老奶奶和一 个年轻漂亮的姑娘。两个上前坐了下来。程序员和那个姑娘他们比较暧昧地相互看对方。这时,火车进入山洞,车厢里一片漆黑。此时,只听见一个亲嘴的声音,随 后就听到一个响亮的巴掌声。很快火车出了山洞,他们四个人都不说话。
那个老奶奶在喃喃道,“这个年轻小伙怎么这么无礼,不过我很高兴我的孙女扇了一个巴掌”。
项目经理在想,“没想到这个程序员居然这么大胆,敢去亲那姑娘,只可惜那姑娘打错了人,居然给打了我。”
漂亮的姑娘想,“他亲了我真好,希望我的祖母没有打疼他”。
程序员坐在那里露出了笑容,“生活真好啊。这一辈子能有几次机会可以在亲一个美女的同时打项目经理一巴掌啊”
在Android中需要使用Ksoap2方式连接
需要使用对应的jar包
1 将ksoap2-android-assembly-2.4-jar-with-dependencies.jar 复制到项目中,并构建路径(文章最后会上传这个架包)
调用核心代码

public String GetUserWS(String methodName,String[] parameterList) {
// 创建SoapObject对象,并指定WebService的命名空间和调用的方法名
SoapObject request = new SoapObject(NAMESPACE, methodName);
// 调用的函数如果有参数,这里可以设置需要传递的参数 注意:第一个参数使用arg0 多个参数依次类推 arg1,arg2...
if(parameterList != null)
{
for (int i = 0; i < parameterList.length; i++) {
request.addProperty("arg"+i, parameterList[i]);
}
} // 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
// envelope.setOutputSoapObject(request);
// 上边的一句等价于下边的这句 将SoapObject对象赋给envelope对象
envelope.bodyOut = request;
// 当前开发的是Java WS 这里需要不调用.net WS
envelope.dotNet = false;
/*
* 这里不要使用 AndroidHttpTransport ht = new AndroidHttpTransport(URL);
* 这是一个要过期的类
* 创建HttpTransportSE对象。通过HttpTransportSE类的构造方法可以指定WebService的WSDL文档的URL
*/
HttpTransportSE ht = new HttpTransportSE(SERVICEURL);
try {
// 请求WS
ht.call(null, envelope);
if (envelope.getResponse() != null) {
// 获得WS函数返回值信息
System.out.println(envelope.getResponse().toString());
return envelope.getResponse().toString();
} } catch (Exception e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
return null;
}

完整代码如下:

package Jason.Test; import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE; import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView; public class WSActivity extends Activity {
// 声明WS的命名空间,命名空间在WSDL的头部显示
private static final String NAMESPACE = "http://Service.Jason.TSD/";
// 设置WS的路径
private static String SERVICEURL = "http://192.168.1.110:8081/UserMgrService/UserInfoPort";
// 要调用的函数名称
private static final String METHOD_NAME = "CalcFun";
private static final String METHOD_NAME1 = "GetUserName";
public static SoapObject soapObject; Button btn1,btn2;
EditText edt1,edt2;
TextView txt1;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn1 = (Button)findViewById(R.id.Btn1);
btn2 = (Button)findViewById(R.id.Btn2);
edt1 = (EditText)findViewById(R.id.edt1);
edt2 = (EditText)findViewById(R.id.edt2);
txt1 = (TextView)findViewById(R.id.txt1);
btn1.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
txt1.setText("结果为:" + GetUserWS(METHOD_NAME1,null));
}
}); btn2.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
String[] parameterList = new String[2];
parameterList[0] = edt1.getText().toString();
parameterList[1] = edt2.getText().toString();
txt1.setText("结果为:" + GetUserWS(METHOD_NAME,parameterList));
}
});
} public String GetUserWS(String methodName,String[] parameterList) {
// 创建SoapObject对象,并指定WebService的命名空间和调用的方法名
SoapObject request = new SoapObject(NAMESPACE, methodName);
// 调用的函数如果有参数,这里可以设置需要传递的参数 注意:第一个参数使用arg0 多个参数依次类推 arg1,arg2...
if(parameterList != null)
{
for (int i = 0; i < parameterList.length; i++) {
request.addProperty("arg"+i, parameterList[i]);
}
} // 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
// envelope.setOutputSoapObject(request);
// 上边的一句等价于下边的这句 将SoapObject对象赋给envelope对象
envelope.bodyOut = request;
// 当前开发的是Java WS 这里需要不调用.net WS
envelope.dotNet = false;
/*
* 这里不要使用 AndroidHttpTransport ht = new AndroidHttpTransport(URL);
* 这是一个要过期的类
* 创建HttpTransportSE对象。通过HttpTransportSE类的构造方法可以指定WebService的WSDL文档的URL
*/
HttpTransportSE ht = new HttpTransportSE(SERVICEURL);
try {
// 请求WS
ht.call(null, envelope);
if (envelope.getResponse() != null) {
// 获得WS函数返回值信息
System.out.println(envelope.getResponse().toString());
return envelope.getResponse().toString();
} } catch (Exception e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
return null;
}
}

记得,需要先编写服务端,并开启服务,在使用客户端进行调用。在进行数据传递时,可以使用Json数据类型,Java中使用JSONArray和JSONObject这两个类就可以解析Json数组或Json对象。
代码及架包以上传至北京天圣达科技公司,欢迎大家下载
【转】Android开发教程 --- Android调用WS的更多相关文章
- [Android开发教程]Android官网developer training中文版教程 - 1.1.1 创建一个Android项目
本系列持续更新中.转载请注明来源. 前言:近期打算系统学习一下Android开发,发现Android官网上的developer training也是个非常好的学习资料,于是想到一边学习一边写一个中文版 ...
- Android开发教程大全介绍
Android是由谷歌在2007年推出的一个开放系统平台,主要针对移动设备市场,目前版本为Android 4.0.Android基于Linux,开发者可以使用Java或C/C++开发Android应用 ...
- ArcGIS Runtime for Android开发教程V2.0(4)基础篇---MapView
原文地址: ArcGIS Runtime for Android开发教程V2.0(4)基础篇---MapView - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NET http:/ ...
- ArcGIS Runtime for Android开发教程V2.0(1)基本概念
原文地址: ArcGIS Runtime for Android开发教程V2.0(1)基本概念 - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NET http://blog.csd ...
- ArcGIS Runtime for Android开发教程V2.0(3)基础篇---Hello World Map
原文地址: ArcGIS Runtime for Android开发教程V2.0(3)基础篇---Hello World Map - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NE ...
- ArcGIS Runtime for Android开发教程V2.0(2)开发环境配置
原文地址: ArcGIS Runtime for Android开发教程V2.0(2)开发环境配置 - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NET http://blog.c ...
- Android开发中怎样调用系统Email发送邮件(多种调用方式)
在Android中调用其他程序进行相关处理,几乎都是使用的Intent,所以,Email也不例外,所谓的调用Email,只是说Email可以接收Intent并做这些事情 我们都知道,在Android中 ...
- AllJoyn+Android开发案例-android跨设备调用方法
AllJoyn+Android开发案例-android跨设备调用方法 项目须要涉及AllJoyn开源物联网框架.前面主要了解了一些AllJoyn主要的概念.像总线,总线附件,总线对象,总线接口这种概念 ...
- Android开发_如何调用系统默认浏览器访问
Android开发_如何调用系统默认浏览器访问 2015-10-20 17:53 312人阅读 http://blog.sina.com.cn/s/blog_6efce07e010142w7.htm ...
随机推荐
- BZOJ.2741.[FOTILE模拟赛]L(分块 可持久化Trie)
题目链接 首先记\(sum\)为前缀异或和,那么区间\(s[l,r]=sum[l-1]^{\wedge}sum[r]\).即一个区间异或和可以转为求两个数的异或和. 那么对\([l,r]\)的询问即求 ...
- jenkins使用总结
这个教程很全面,可以参考 https://www.jianshu.com/p/dceaa1c7bb49
- navLI鼠标滑上显示下拉导航
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>l ...
- C++ 函数模板基础知识
为什么要引入模板:为了避免代码重复,程序员可以编写脱离数据类型通用模板. 模板的分类:函数模板 + 类模板 注意:模板的声明或定义只能在全局,命名空间或类范围内进行.不能在函数内进行,比如不能在mai ...
- centos7 rabbitmq集群搭建+高可用
环境 [root@node1 ~]# cat /etc/redhat-release CentOS Linux release (Core) [root@node1 ~]# uname -r -.el ...
- Unity枚举和字符串的相互转换
直接上代码,见下图: public enum enumEx { A, B, C, D, } public class enumTest : MonoBehaviour { void Start () ...
- Kubernetes中的亲和性与反亲和性
通常情况下,Pod分配到哪些Node是不需要管理员操心的,这个过程会由scheduler自动实现.但有时,我们需要指定一些调度的限制,例如某些应用应该跑在具有SSD存储的节点上,有些应用应该跑在同一个 ...
- 使用promise 和 generator来管理工作流
根据p219的代码改编 示例代码如下 function oneStep(value){ return new Promise(function(resolve, reject){ resolve('o ...
- MongoDB学习笔记(一)安装配置
文档存储:文档存储一般用类似json的格式存储,存储的内容是文档型的. MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成.MongoDB 文档类似于 JSON ...
- Linux系统中安装使用百度云网盘
百度云没有Linux客户端,于是有大神用Go语言写出来一个叫BaiduPCS-Go的命令行盘客户端,可以通过终端操作百度云盘,在Linux上实现上传下载.但是因为是命令行版本的,对没有命令行使用基础的 ...