原文地址: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的更多相关文章

  1. [Android开发教程]Android官网developer training中文版教程 - 1.1.1 创建一个Android项目

    本系列持续更新中.转载请注明来源. 前言:近期打算系统学习一下Android开发,发现Android官网上的developer training也是个非常好的学习资料,于是想到一边学习一边写一个中文版 ...

  2. Android开发教程大全介绍

    Android是由谷歌在2007年推出的一个开放系统平台,主要针对移动设备市场,目前版本为Android 4.0.Android基于Linux,开发者可以使用Java或C/C++开发Android应用 ...

  3. ArcGIS Runtime for Android开发教程V2.0(4)基础篇---MapView

    原文地址: ArcGIS Runtime for Android开发教程V2.0(4)基础篇---MapView - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NET http:/ ...

  4. ArcGIS Runtime for Android开发教程V2.0(1)基本概念

    原文地址: ArcGIS Runtime for Android开发教程V2.0(1)基本概念 - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NET http://blog.csd ...

  5. ArcGIS Runtime for Android开发教程V2.0(3)基础篇---Hello World Map

    原文地址: ArcGIS Runtime for Android开发教程V2.0(3)基础篇---Hello World Map - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NE ...

  6. ArcGIS Runtime for Android开发教程V2.0(2)开发环境配置

    原文地址: ArcGIS Runtime for Android开发教程V2.0(2)开发环境配置 - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NET http://blog.c ...

  7. Android开发中怎样调用系统Email发送邮件(多种调用方式)

    在Android中调用其他程序进行相关处理,几乎都是使用的Intent,所以,Email也不例外,所谓的调用Email,只是说Email可以接收Intent并做这些事情 我们都知道,在Android中 ...

  8. AllJoyn+Android开发案例-android跨设备调用方法

    AllJoyn+Android开发案例-android跨设备调用方法 项目须要涉及AllJoyn开源物联网框架.前面主要了解了一些AllJoyn主要的概念.像总线,总线附件,总线对象,总线接口这种概念 ...

  9. Android开发_如何调用系统默认浏览器访问

    Android开发_如何调用系统默认浏览器访问 2015-10-20 17:53 312人阅读  http://blog.sina.com.cn/s/blog_6efce07e010142w7.htm ...

随机推荐

  1. PCB封装步骤教程

    疑问解答:为什么要封装? 就是元器件往PCB板上焊接时在板上的焊盘尺寸. 这里我以AT89C51单片机为例: 1.首先新建一个PCB元件库. 再找一个路径保存起来命名为DIP40,方便以后寻找 选择菜 ...

  2. 移动端html页面优化

    对于访问量大的网站来说,前端的优化是必须的,即使是优化1KB的大小对其影响也很大,下面来看看来自ISUX的米随随讲讲移动手机平台的HTML5前端优化,或许对你有帮助和启发. 概述 1. PC优化手段在 ...

  3. 喵哈哈村的魔法考试 Round #10 (Div.2) 题解

    喵哈哈村与哗啦啦村的大战(一) 最大值就是全部+3,最小值就是全部-3,注意不能降为负数. #include<bits/stdc++.h> using namespace std; con ...

  4. Java之String、StringBuilder、StringBuffer的区别

    String : 字符串常量,它们的值在创建之后不能更改.代表字符串,Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. String的值是不可变的,这就 ...

  5. .net core 3.0中可以使用gRPC了

    今天发现.net core下有gRPC模板了,这个可是补全了.net core下高性能RPC框架缺失这一大短板了. 使用模板创建了工程后,发现连客户端的示例也创建了. 更加给力的是,IDE是能直接识别 ...

  6. linux目录的权限

    Answer: When applying permissions to directories on Linux, the permission bits have different meanin ...

  7. android:Button控件

    Button 是程序用于和用户进行交互的一个重要控件,相信你对这个控件已经是非常熟悉 了,因为我们在上一章用了太多次 Button.它可配置的属性和 TextView 是差不多的,我们 可以在 act ...

  8. 普通用户使用docker命令免sudo权限的问题

    方法很多,只写一种 操作步骤: 使用有sudo权限的帐号登录系统. 创建docker分组,并将相应的用户添加到这个分组里面. sudo usermod -aG docker your_username ...

  9. 动态规划之 <筷子>

    描述 A 先生有很多双筷子.确切的说应该是很多根,因为筷子的长度不一,很难判断出哪两根是一双的.这天,A 先生家里来了K 个客人,A 先生留下他们吃晚饭.加上A 先生,A夫人和他们的孩子小A,共K+3 ...

  10. CucumberPeople 1.3.2 发布

    CucumberPeople 网站: http://alterhu.github.io/CucumberPeople/ This eclipse plugin based on RubyMine ,a ...