android调用web service(cxf)实例
Google為ndroid平臺開發(fā)Web Service提供了支持,提供了Ksoap2-android相關(guān)架包
1.下載該夾包可以直接登錄http://code.google.com/p/ksoap2-android/,現(xiàn)在該站點(diǎn)已經(jīng)提供了直接的下載,只要點(diǎn)擊下載鏈接就可以下載了;
我現(xiàn)在的是ksoap2-android-assembly-2.6.5-jar-with-dependencies.jar
2.好了,現(xiàn)在我們就可以進(jìn)行新建項(xiàng)目來進(jìn)行測試了,首先我們先建立java服務(wù)端,這里的一些前期準(zhǔn)備我就不說了(比如與spring的整合等示例),
如果有不清楚的可以去看博客? http://www.cnblogs.com/shenliang123/archive/2012/04/16/2451580.html
由于這里重點(diǎn)是android客戶端,java服務(wù)器端就直接給代碼了
Interface:(這里提供了兩個(gè)方法,一個(gè)傳遞的是簡單字符串,另一個(gè)傳遞的是符合對象+集合)
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 {@Overridepublic String getUser(String name) {System.out.println("客戶端傳遞的名字為 = "+name);return name;}@Overridepublic StudentList getStuList() {System.out.println("該方法被調(diào)用");List<Students> stuList = new ArrayList<Students>();//第一個(gè)學(xué)生Students stu1 = new Students();stu1.setStuName("沈浪");stu1.setStuNum("1006010054");stu1.setStuSex("男");stuList.add(stu1);//第二個(gè)學(xué)生Students stu2 = new Students();stu2.setStuName("香香");stu2.setStuNum("1006010043");stu2.setStuSex("女");stuList.add(stu2);//將List集合封裝成一個(gè)對象才能在webService中進(jìn)行傳遞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的整合配置文件中進(jìn)行如下配置即可(默認(rèn)web.xml中已經(jīng)進(jìn)行配置)
<?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.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://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" />警告提示已經(jīng)廢棄了cxf-extension-soap.xml文件--><import resource="classpath:META-INF/cxf/cxf-servlet.xml" /><!-- 這里配置服務(wù)接口,后面描述id:指在spring配置的bean的ID.Implementor:指明具體的實(shí)現(xiàn)類.Address:指明這個(gè)web service的相對地址--><!-- 測試 --><bean id="testServiceImpl" class="xidian.sl.service.impl.webService.TestServiceImpl" ></bean><jaxws:endpoint id="testService" implementor="#testServiceImpl"address="/test" /><!-- 開啟tomcat服務(wù)器 ,訪問http://localhost:8080/WebExam/services/test?wsdl http://localhost:8080/WebExam是本項(xiàng)目的訪問地址services是由于web.xml配置所得,test是由于Spring配置文件中的address屬性所得--></beans>3.到此服務(wù)器端的已經(jīng)建立完全,我們可以測試下:開啟tomcat,然后在瀏覽器中輸入http://localhost:8090/WebExam/services/test?wsdl可以查看wsdl
現(xiàn)在我們就可以開始建立android客戶端了
新建一個(gè)項(xiàng)目后導(dǎo)入ksoap2-android-assembly-2.6.5-jar-with-dependencies.jar,這里要特別注意:導(dǎo)入包的方式不要選擇項(xiàng)目右鍵---->build path---->
add external archives...,如果使用這種方式表面上好像是導(dǎo)入了包,但還是沒有辦法引用到,然后啟動項(xiàng)目后一直會報(bào):
我們還是選擇和開發(fā)web一樣的方式,就是在項(xiàng)目下新建lib或者libs文件夾,然后將jar直接復(fù)制到該文件夾中,IDE會幫助直接引入的:
這樣就正確無誤了,不再會報(bào)類無法引用到了
android中通過webservice調(diào)用服務(wù)器端其實(shí)還是很簡單的,只要按部就班的按照下面步驟進(jìn)行即可:
(1)創(chuàng)建HttpTransportSE對象,該對象用于調(diào)用WebService操作
HttpTransportSE ht = new HttpTransportSE(SERVICE_URL);(2)創(chuàng)建SoapSerializationEnvelope對象
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);(3)創(chuàng)建SoapObject對象,創(chuàng)建該對象時(shí)需要傳入所要調(diào)用的Web Service的命名空間和WebService方法名
SoapObject request = new SoapObject(SERVICE_NS, methodName);(4)如果有參數(shù)傳給Web Service服務(wù)器端,調(diào)用SoapObject對象的addProperty(String name, Object value)方法來設(shè)置參數(shù),該方法的name參數(shù)指定參數(shù)名
注意:參數(shù)名不一定要與服務(wù)端的方法中的參數(shù)名相同,只要對應(yīng)順序相同即可;value參數(shù)指定參數(shù)值
request.addProperty("name", "1006010054");(5)調(diào)用SoapSerializationEnvelope的setOutputSoapObject()方法,或者直接對bodyOut屬性賦值,將前兩步創(chuàng)建的SoapObject對象設(shè)為SoapSerializationEnvelope
的傳出SOAP消息體
envelope.bodyOut = request;(6)調(diào)用對象的call()方法,并以SoapSerializationEnvelope作為參數(shù)調(diào)用遠(yuǎn)程的web service
ht.call(null, envelope);(7)掉用完成后,訪問SoapSerializationEnvelope對象的bodyIn屬性,該屬性返回一個(gè)SoapObject對象,該對象就代表Web service的返回消息,解析該對象,即可獲得
調(diào)用web service的返回值
SoapObject result = (SoapObject) envelope.bodyIn;String name = result.getProperty(0).toString();下面給書具體的實(shí)例:
mian.xml很簡單就是兩個(gè)編輯框:
Activity:(該Activity調(diào)用了服務(wù)器端返回普通字符串的方法)
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. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);txt1 = (EditText) findViewById(R.id.editText1);txt2 = (EditText) findViewById(R.id.editText2);//調(diào)用的方法String methodName = "getUser";//創(chuàng)建httpTransportSE傳輸對象HttpTransportSE ht = new HttpTransportSE(SERVICE_URL);ht.debug = true;//使用soap1.1協(xié)議創(chuàng)建Envelop對象SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);//實(shí)例化SoapObject對象SoapObject request = new SoapObject(SERVICE_NS, methodName);/*** 設(shè)置參數(shù),參數(shù)名不一定需要跟調(diào)用的服務(wù)器端的參數(shù)名相同,只需要對應(yīng)的順序相同即可* */request.addProperty("name", "1006010054");//將SoapObject對象設(shè)置為SoapSerializationEnvelope對象的傳出SOAP消息envelope.bodyOut = request;try{//調(diào)用webServiceht.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進(jìn)行Activity的注冊和并添加訪問網(wǎng)絡(luò)的權(quán)限
<?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" /><applicationandroid:icon="@drawable/ic_launcher"android:label="@string/app_name" ><activityandroid: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><!-- 聲明該應(yīng)用自身所擁有的權(quán)限 --><uses-permission android:name="android.permission.INTERNET" /> </manifest>運(yùn)行后的結(jié)果如圖所示:
下面我們來試著調(diào)用回傳符合對象的方法:
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. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);txt1 = (EditText) findViewById(R.id.editText1);txt2 = (EditText) findViewById(R.id.editText2);//調(diào)用的方法String methodName = "getStuList";//創(chuàng)建httpTransportSE傳輸對象HttpTransportSE ht = new HttpTransportSE(SERVICE_URL);ht.debug = true;//使用soap1.1協(xié)議創(chuàng)建Envelop對象SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);//實(shí)例化SoapObject對象SoapObject request = new SoapObject(SERVICE_NS, methodName);/*** 設(shè)置參數(shù),參數(shù)名不一定需要跟調(diào)用的服務(wù)器端的參數(shù)名相同,只需要對應(yīng)的順序相同即可* *///request.addProperty("name", "1006010054");//將SoapObject對象設(shè)置為SoapSerializationEnvelope對象的傳出SOAP消息envelope.bodyOut = request;try{//調(diào)用webServiceht.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("學(xué)號["+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();}} }區(qū)別就是對于返回值的處理上,使用幾次getPropert()方法,這里主要看返回值的層次,看下面的結(jié)果應(yīng)該就能明白了,根據(jù)括號的層次來進(jìn)行確定
?
?
?
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/shenliang123/archive/2012/07/05/2578586.html
總結(jié)
以上是生活随笔為你收集整理的android调用web service(cxf)实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《那些年啊,那些事——一个程序员的奋斗史
- 下一篇: vs2008 添加头文件路径