- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章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服务端,这里的一些前期准备我就不说了(比如与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()方法,这里主要看返回值的层次,看下面的结果应该就能明白了,根据括号的层次来进行确定 。
。
最后此篇关于android调用web service(cxf)实例应用详解的文章就讲到这里了,如果你想了解更多关于android调用web service(cxf)实例应用详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个几乎可以构建的Maven / Grails应用,但在web.xml上找不到[my-app]\webapp\WEB-INF\web.xml。但是目录结构像往常一样包含web-app文件夹,而不是
正如我在标题中提到的:我想知道 web-service 和 web-socket 之间的区别?我们什么时候使用每一个? 谢谢! 最佳答案 一个web service是一个响应客户端 SOAP/REST
让我们看一个示例场景: 客户端打开一个网站并找到他从文本框中输入的两个数字的总和。然后单击“添加”按钮。两个参数通过 HTTP GET 发送到服务器,在服务器上写入 PHP 代码以添加数字,结果为回声
我知道这是一个老问题,肯定已经被回答了数百次,但我还无法找到令人满意的答案。 我正在创建一个应用程序,其他应用程序(移动/网络)将使用该应用程序来获取数据。现在我有两个选择: 将我的应用程序创建为简单
通过 Web 作业部署新功能有 3 种方法: 创建一个新的 Web 应用,并部署一个包含该函数的 Web 作业。 向现有 Web 作业添加一项新函数(这样您现在在一个 Web 作业中就拥有了多个函数)
我收到来自网络场景的通知,上面写着“问题”和“确定”。我想在问题发生时包含网络响应的内容。我不担心标题值,只担心网页的内容. 这是我可以在通知设置中引用的变量吗? 最佳答案 不幸的是 zabbix 不
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
嗨,这是一个理论问题,但我真的无法弄清楚 Web 应用程序、基于 Web 的应用程序和基于云的应用程序之间的区别。这个你能帮我吗。 最佳答案 @Matt 是对的 - 这真的无关紧要,但是,为了清楚起见
我正在尝试使用多个 Web 服务,这些服务在它们的 wsdl 中重新定义了一些相同的公共(public)类。我目前在网站中引用了它们,但我想转换为 Web 应用程序。 由于一些相同的类是从多个 Web
一个。我必须考虑哪些事项?b.当前应用程序正在执行多个存储过程。如果我创建等效的方法来执行这些过程,会有什么风险或挑战。 最佳答案 在架构上,将网络应用程序转换为网络服务时必须考虑的一件事是,对方法和
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 5年前关闭。 Improve thi
网络 API 和网络服务之间有什么区别吗?或者它们是同一个吗? 最佳答案 网络服务通常提供 WSDL您可以从中自动创建客户端 stub 。 Web 服务基于 SOAP protocol 。ASP.NE
我已经获得了我需要的所有资源。我将 Web 服务放入应用程序服务环境中,然后将 NSG 连接到应用程序服务环境使用的子网。然后,我允许 VNET 内的应用程序与 Web 服务进行通信,但它无法正常工作
我已经获得了我需要的所有资源。我将 Web 服务放入应用程序服务环境中,然后将 NSG 连接到应用程序服务环境使用的子网。然后,我允许 VNET 内的应用程序与 Web 服务进行通信,但它无法正常工作
我正在使用 stub 将我的网络服务相关测试与实际网络服务隔离开来。 你/我应该如何合并测试以确保我制作的响应与实际的网络服务匹配(我无法控制它)? 我不想知道怎么做,而是何时何地? 我应该为测试数据
我在互联网上搜索了很多,但我仍然没有得到网络服务和网络 API 之间的明显区别?我在某处读到所有 Web 服务都是 API,但所有 API 都不是 Web 服务。如何? 我所知道的是两者都允许利用其他
假设我已经完成了使用 JavaEE 制作的 Web 应用程序。这个 Web 应用程序包含登录系统,但最后它是非常基本的 Web 应用程序。我使用的是 GlassFish 3.1.2.2。 我想知道一旦
我希望设计者能够打开与我相同的解决方案文件。这可以通过 Expressions Web 实现吗? 最佳答案 简短的回答是“不”;但这是一个非常常见的请求,我知道很多人都希望下一个版本(无论何时)对此有
我正在尝试在 CF10 中创建一个 Web 服务对象。我已验证它在 SoapUI 中按预期工作。但是,当我在 CF 中运行它时,我得到一个错误,它无法找到在 WSDL 的导入语句中导入的 XSD。这是
我的要求是开发一个 Web 服务,充当外部 Web 服务和客户端之间的中间人。 我知道,我可以为我的服务设计一个wsdl,然后将外部wsdl映射到代码中我的wsdl。我的问题是有一个开源 api/工具
我是一名优秀的程序员,十分优秀!