android调用web service(cxf)实例应用详解_Android

Google为ndroid平台开发Web Service提供了支持,提供了Ksoap2-android相关架包
1.下载该夹包可以直接登录http://code.google.com/p/ksoap2-android/,现在该站点已经提供了直接的下载,只要点击下载链接就可以下载了;
我现在的是ksoap2-android-assembly-2.6.5-jar-with-dependencies.jar

2.好了,现在我们就可以进行新建项目来进行测试了,首先我们先建立java服务端,这里的一些前期准备我就不说了(比如与spring的整合等示例),
由于这里重点是android客户端,java服务器端就直接给代码了

Interface:(这里提供了两个方法,一个传递的是简单字符串,另一个传递的是符合对象+集合)

复制代码 代码如下:

package xidian.sl.service.webService;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
import xidian.sl.service.impl.webService.StudentList;
@WebService
@SOAPBinding(style = Style.RPC)
public interface TestService {
public String getUser(@WebParam(name = "name")String name);
public StudentList getStuList();
}

implement:

复制代码 代码如下:

package xidian.sl.service.impl.webService;
import java.util.ArrayList;
import java.util.List;
import javax.jws.WebService;
import xidian.sl.entity.Students;
import xidian.sl.service.webService.TestService;
@WebService(endpointInterface = "xidian.sl.service.webService.TestService")
public class TestServiceImpl implements TestService {
@Override
public String getUser(String name) {
System.out.println("客户端传递的名字为 = "+name);
return name;
}
@Override
public StudentList getStuList() {
System.out.println("该方法被调用");
List<Students> stuList = new ArrayList<Students>();
//第一个学生
Students stu1 = new Students();
stu1.setStuName("沈浪");
stu1.setStuNum("1006010054");
stu1.setStuSex("男");
stuList.add(stu1);
//第二个学生
Students stu2 = new Students();
stu2.setStuName("香香");
stu2.setStuNum("1006010043");
stu2.setStuSex("女");
stuList.add(stu2);
//将List集合封装成一个对象才能在webService中进行传递
StudentList studentList = new StudentList();
studentList.setStuList(stuList);
return studentList;
}
}

list的封装对象

复制代码 代码如下:

package xidian.sl.service.impl.webService;
import java.util.List;
import xidian.sl.entity.Students;
public class StudentList {
private List<Students> stuList;
public List<Students> getStuList() {
return stuList;
}
public void setStuList(List<Students> stuList) {
this.stuList = stuList;
}
}

然后在srping的整合配置文件中进行如下配置即可(默认web.xml中已经进行配置)

复制代码 代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml" /> <!-- 这些xml文件在cxf-2.5.0.jar的META-INF目录下-->
<!--<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
警告提示已经废弃了cxf-extension-soap.xml文件-->
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<!-- 这里配置服务接口,后面描述
id:指在spring配置的bean的ID.
Implementor:指明具体的实现类.
Address:指明这个web service的相对地址
-->
<!-- 测试 -->
<bean id="testServiceImpl" class="xidian.sl.service.impl.webService.TestServiceImpl" >
</bean>
<jaxws:endpoint id="testService"
implementor="#testServiceImpl"
address="/test" />
<!-- 开启tomcat服务器 ,访问http://localhost:8080/WebExam/services/test?wsdl
http://localhost:8080/WebExam是本项目的访问地址
services是由于web.xml配置所得,test是由于Spring配置文件中的address属性所得
-->
</beans>

3.到此服务器端的已经建立完全,我们可以测试下:开启tomcat,然后在浏览器中输入http://localhost:8090/WebExam/services/test?wsdl可以查看wsdl

现在我们就可以开始建立android客户端了
新建一个项目后导入ksoap2-android-assembly-2.6.5-jar-with-dependencies.jar,这里要特别注意:导入包的方式不要选择项目右键---->build path---->
add external archives...,如果使用这种方式表面上好像是导入了包,但还是没有办法引用到,然后启动项目后一直会报:
 
我们还是选择和开发web一样的方式,就是在项目下新建lib或者libs文件夹,然后将jar直接复制到该文件夹中,IDE会帮助直接引入的:

 
这样就正确无误了,不再会报类无法引用到了
android中通过webservice调用服务器端其实还是很简单的,只要按部就班的按照下面步骤进行即可:
(1)创建HttpTransportSE对象,该对象用于调用WebService操作

复制代码 代码如下:

HttpTransportSE ht = new HttpTransportSE(SERVICE_URL);

(2)创建SoapSerializationEnvelope对象

复制代码 代码如下:

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope
(SoapEnvelope.VER11);

(3)创建SoapObject对象,创建该对象时需要传入所要调用的Web Service的命名空间和WebService方法名

复制代码 代码如下:

SoapObject request = new SoapObject(SERVICE_NS, methodName);

(4)如果有参数传给Web Service服务器端,调用SoapObject对象的addProperty(String name, Object value)方法来设置参数,该方法的name参数指定参数名
注意:参数名不一定要与服务端的方法中的参数名相同,只要对应顺序相同即可;value参数指定参数值

复制代码 代码如下:

request.addProperty("name", "1006010054");

(5)调用SoapSerializationEnvelope的setOutputSoapObject()方法,或者直接对bodyOut属性赋值,将前两步创建的SoapObject对象设为SoapSerializationEnvelope的传出SOAP消息体

复制代码 代码如下:

envelope.bodyOut = request;

(6)调用对象的call()方法,并以SoapSerializationEnvelope作为参数调用远程的web service

复制代码 代码如下:

ht.call(null, envelope);

(7)掉用完成后,访问SoapSerializationEnvelope对象的bodyIn属性,该属性返回一个SoapObject对象,该对象就代表Web service的返回消息,解析该对象,即可获得调用web service的返回值

复制代码 代码如下:

SoapObject result = (SoapObject) envelope.bodyIn;
String name = result.getProperty(0).toString();

下面给书具体的实例
mian.xml很简单就是两个编辑框:

复制代码 代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
<EditText
android:id="@+id/editText1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10" >
<requestFocus />
</EditText>
<EditText
android:id="@+id/editText2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10" />
</LinearLayout>

Activity:(该Activity调用了服务器端返回普通字符串的方法)

复制代码 代码如下:

package xidian.sl.android.webservice;
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.widget.EditText;
public class WebServiceSimpleDemo extends Activity{
final static String SERVICE_NS = "http://webService.service.sl.xidian/";
final static String SERVICE_URL = "http://192.168.1.103:8090/WebExam/services/test";
private EditText txt1;
private EditText txt2;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
txt1 = (EditText) findViewById(R.id.editText1);
txt2 = (EditText) findViewById(R.id.editText2);
//调用的方法
String methodName = "getUser";
//创建httpTransportSE传输对象
HttpTransportSE ht = new HttpTransportSE(SERVICE_URL);
ht.debug = true;
//使用soap1.1协议创建Envelop对象
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
//实例化SoapObject对象
SoapObject request = new SoapObject(SERVICE_NS, methodName);
/**
* 设置参数,参数名不一定需要跟调用的服务器端的参数名相同,只需要对应的顺序相同即可
* */
request.addProperty("name", "1006010054");
//将SoapObject对象设置为SoapSerializationEnvelope对象的传出SOAP消息
envelope.bodyOut = request;
try{
//调用webService
ht.call(null, envelope);
//txt1.setText("看看"+envelope.getResponse());
if(envelope.getResponse() != null){
txt2.setText("有返回");
SoapObject result = (SoapObject) envelope.bodyIn;
String name = result.getProperty(0).toString();
txt1.setText("返回值 = "+name);
}else{
txt2.setText("无返回");
}
}catch (Exception e) {
e.printStackTrace();
}
}
}

在AndroidManifest.xml进行Activity的注册和并添加访问网络的权限

复制代码 代码如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xidian.sl.android.webservice"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="10" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".WebServiceSimpleDemo"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<!-- 声明该应用自身所拥有的权限 -->
<uses-permission android:name="android.permission.INTERNET" />
</manifest>

运行后的结果如图所示:


下面我们来试着调用回传符合对象的方法:
activity:

复制代码 代码如下:

package xidian.sl.android.webservice;
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.widget.EditText;
public class WebServiceComplexDemo extends Activity{
final static String SERVICE_NS = "http://webService.service.sl.xidian/";
final static String SERVICE_URL = "http://192.168.1.103:8090/WebExam/services/test";
private EditText txt1;
private EditText txt2;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
txt1 = (EditText) findViewById(R.id.editText1);
txt2 = (EditText) findViewById(R.id.editText2);
//调用的方法
String methodName = "getStuList";
//创建httpTransportSE传输对象
HttpTransportSE ht = new HttpTransportSE(SERVICE_URL);
ht.debug = true;
//使用soap1.1协议创建Envelop对象
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
//实例化SoapObject对象
SoapObject request = new SoapObject(SERVICE_NS, methodName);
/**
* 设置参数,参数名不一定需要跟调用的服务器端的参数名相同,只需要对应的顺序相同即可
* */
//request.addProperty("name", "1006010054");
//将SoapObject对象设置为SoapSerializationEnvelope对象的传出SOAP消息
envelope.bodyOut = request;
try{
//调用webService
ht.call(null, envelope);
txt2.setText("回传的值 :"+envelope.getResponse());
if(envelope.getResponse() != null){
SoapObject result = (SoapObject) envelope.bodyIn;
SoapObject soapChilds = (SoapObject)result.getProperty(0);
StringBuffer sb = new StringBuffer();
for(int i=0; i <soapChilds.getPropertyCount(); i++){
SoapObject soapChildsChilds = (SoapObject)soapChilds.getProperty(i);
sb.append("姓名["+i+"] = "+soapChildsChilds.getProperty(0).toString()+"\n");
sb.append("学号["+i+"] = "+soapChildsChilds.getProperty(1).toString()+"\n");
sb.append("性别["+i+"] = "+soapChildsChilds.getProperty(2).toString()+"\n"+"\n");
}
txt1.setText(sb.toString());
}else{
txt1.setText("无返回");
}
}catch (Exception e) {
e.printStackTrace();
}
}
}

区别就是对于返回值的处理上,使用几次getPropert()方法,这里主要看返回值的层次,看下面的结果应该就能明白了,根据括号的层次来进行确定

时间: 2024-09-19 09:35:27

android调用web service(cxf)实例应用详解_Android的相关文章

android调用web service(cxf)实例应用详解

Google为ndroid平台开发Web Service提供了支持,提供了Ksoap2-android相关架包 1.下载该夹包可以直接登录http://code.google.com/p/ksoap2-android/,现在该站点已经提供了直接的下载,只要点击下载链接就可以下载了: 我现在的是ksoap2-android-assembly-2.6.5-jar-with-dependencies.jar 2.好了,现在我们就可以进行新建项目来进行测试了,首先我们先建立java服务端,这里的一些前期

Android Activity 与Service进行数据交互详解_Android

①从设计的角度来讲: Android的Activity的设计与Web页面非常类似,从页面的跳转通过连接,以及从页面的定位通过URL,从每个页面的独立封装等方面都可以看出来,它主要负责与用户进行交互. Service则是在后台运行,默默地为用户提供功能,进行调度和统筹.如果一棵树的地上部分是Activity的话,它庞大的根须就是Service.Android的服务组件没有运行在独立的进程或线程中,它和其他的组件一样也在应用的主线程中运行,如果服务组件执行比较耗时的操作就会导致主线程阻塞或者假死,从

android教程之service使用方法示例详解_Android

Service的生命周期 (适用于2.1及以上) 1. 被startService的无论是否有任何活动绑定到该Service,都在后台运行.onCreate(若需要) -> onStart(int id, Bundle args).  多次startService,则onStart调用多次,但不会创建多个Service实例,只需要一次stop.该Service一直后台运行,直到stopService或者自己的stopSelf()或者资源不足由平台结束. 2. 被bindService的调用bin

Android编程实现自定义手势的方法详解_Android

本文实例讲述了Android编程实现自定义手势的方法.分享给大家供大家参考,具体如下: 之前介绍过如何在Android程序中使用手势,主要是系统默认提供的几个手势,这次介绍一下如何自定义手势,以及如何对其进行管理. 先介绍一下Android系统对手势的管理,Android系统允许应用程序把用户的手势以文件的形式保存以前,以后要使用这些手势只需要加载这个手势库文件即可,同时Android系统还提供了诸如手势识别.查找及删除等的函数接口,具体如下: 一.加载手势库文件: staticGestureL

Android学习笔记之ContentProvider和Uri详解_Android

本文介绍了自定义Content Provider的相关内容,完全解析内容提供者的用法.Content Provider,内容提供者,相信大家对这个组件的名字都不陌生,可能是自己平时做的都是一些简单的App,所以对于Content Provider的使用并不是很多,也不是特别熟悉.但是这里还是对Content Provider作个简单的总结,不是很深入,但是希望能给包括我在内的初学者一点帮助,看完这篇能对这个组件有个总体上的了解. 一.使用ContentProvider(内容提供者)共享数据 Co

Android中asset和raw的区别详解_Android

*res/raw和assets的相同点: 1.两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制. *res/raw和assets的不同点: 1.res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename:assets文件夹下的文件不会被映射到 R.java中,访问的时候需要AssetManager类. 2.res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹 *读取文件资源

Web Service描述语言 WSDL 详解(2)--WSDL文件示例[转]

web|示例|详解 让我们来研究一下WSDL文件,看看它的结构,以及如何工作.请注意这是一个非常简单的WSDL文档实例.我们的意图只是说明它最显著的特征.以下的内容中包括更加详细的讨论. <?xml version="1.0" encoding="UTF-8" ?><definitions name="FooSample" targetNamespace="http://tempuri.org/wsdl/"

Web Service描述语言 WSDL 详解(1)--为什么使用WSDL?[转]

web|详解 像Internet协议之类的标准有没有为权威所利用,或者人们这样看待它是因为顺之所获的好处远远超出了代价?曾经有许多试图建立的标准都流产了.有时候,那些还没有普遍使用的标准甚至由法令或政府规定强行推出:Ada语言就是一例. 我相信正是跟随标准所带来的好处使它广泛接受.例如,对于铁路服务来说,真正重要的是,不同公司所铺设的铁路结合到一起,或者是来自好几个公司的产品协调的工作在一起.几家大的企业合力建立了SOAP标准.Web Service描述语言(WSDL)向这种Web Servic

Android 获取手机联系人实例代码详解_Android

我的风格,废话不多说了,直接给大家贴代码了. 具体代码如下所示: package com.org.demo.demo; import com.org.wangfeng.R; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Butt