Android开发教程 --- Android调用WS

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对象。

代码及架包以上传至北京天圣达科技公司,欢迎大家下载

posted @ 2011-12-23 08:44  Jason_CC  Views(3709)  Comments(11Edit  收藏  举报