亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

android調用web service(cxf)實例應用詳解

2020-04-11 12:34:45
字體:
來源:轉載
供稿:網友
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()方法,這里主要看返回值的層次,看下面的結果應該就能明白了,根據括號的層次來進行確定

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品网址在线观看| 日韩av网站电影| 亚洲第一综合天堂另类专| 欧美大全免费观看电视剧大泉洋| 91在线网站视频| 色哟哟网站入口亚洲精品| 日韩视频亚洲视频| 亚洲黄色av女优在线观看| 日韩欧美在线视频日韩欧美在线视频| 亚洲午夜未删减在线观看| 久久影院模特热| 高清欧美性猛交xxxx黑人猛交| 亚洲欧美日韩网| 亚洲欧美一区二区三区情侣bbw| 亚洲级视频在线观看免费1级| 国产丝袜视频一区| 国产精品久久国产精品99gif| 国产精品观看在线亚洲人成网| 亚洲欧美激情四射在线日| 日韩精品极品毛片系列视频| 91精品久久久久久久久久| 日韩欧美在线视频| 亚洲缚视频在线观看| 韩日欧美一区二区| 国内精品国产三级国产在线专| 久久久久久18| 亚洲色图激情小说| 粉嫩av一区二区三区免费野| 久久理论片午夜琪琪电影网| 一区二区三区四区视频| 久久久综合av| 国产精品视频中文字幕91| 国产91精品久久久久| 亚洲电影免费观看高清完整版在线| 久久精品免费播放| 日韩电视剧在线观看免费网站| 91亚洲精品在线| 亚洲成人黄色在线观看| 国产视频久久久久久久| 国产成人涩涩涩视频在线观看| 欧美理论电影在线播放| 久久人人爽亚洲精品天堂| 日韩中文字幕在线观看| 国产亚洲精品va在线观看| 久久国产精品久久精品| 日韩久久免费视频| 91日本在线视频| 91wwwcom在线观看| 成人激情在线观看| 国产精品永久免费观看| 日韩av影片在线观看| 欧美一区二区三区四区在线| 最新国产精品拍自在线播放| 川上优av一区二区线观看| 日韩电视剧免费观看网站| 欧美激情女人20p| 日韩大片在线观看视频| 久久男人资源视频| 国产免费一区二区三区在线观看| 国产精品黄页免费高清在线观看| 一区二区三区精品99久久| 日本国产高清不卡| 成人在线小视频| 久久久精品国产| 成人黄色在线免费| 欧洲亚洲免费在线| 成人激情视频小说免费下载| 久久91亚洲精品中文字幕奶水| 2024亚洲男人天堂| 日本欧美中文字幕| 九九热最新视频//这里只有精品| 狠狠做深爱婷婷久久综合一区| 日韩最新免费不卡| 亚洲国产97在线精品一区| 欧美另类高清videos| 日韩美女免费视频| 久久亚洲精品中文字幕冲田杏梨| 日韩av综合中文字幕| 日本久久91av| 欧美激情一区二区三区在线视频观看| 亚洲午夜精品久久久久久性色| 日韩欧美亚洲成人| 91欧美精品成人综合在线观看| 中文字幕在线看视频国产欧美在线看完整| 性色av一区二区三区| 最好看的2019的中文字幕视频| www高清在线视频日韩欧美| 全色精品综合影院| 亚洲精品美女在线观看播放| 亚洲高清久久网| 成人性生交大片免费看视频直播| 日韩精品欧美激情| 亚洲一区二区三区在线视频| 亚洲一区二区三区sesese| 成人日韩在线电影| 亚洲成人1234| 日韩最新中文字幕电影免费看| 亚洲一区二区三区视频| 精品美女久久久久久免费| 欧美午夜精品久久久久久久| 日韩在线国产精品| 成人av番号网| 亚洲性日韩精品一区二区| 中文欧美日本在线资源| 久久全国免费视频| 91网站在线免费观看| 亚洲精品第一国产综合精品| 成人黄色在线播放| 日韩免费看的电影电视剧大全| 欧美孕妇孕交黑巨大网站| 亚洲欧美制服综合另类| 日韩av网址在线| 欧美日韩亚洲一区二区三区| 狠狠色狠狠色综合日日小说| 国产综合香蕉五月婷在线| 精品欧美激情精品一区| 日韩av影片在线观看| 亚洲欧美成人网| 欧美日本精品在线| 97国产精品免费视频| 精品久久久久久久久久ntr影视| 日韩在线一区二区三区免费视频| 亚洲电影在线观看| 欧美成人全部免费| 精品香蕉在线观看视频一| 久久影视三级福利片| 亚洲国产精品va在线看黑人动漫| 成人免费网站在线看| 91高清视频在线免费观看| 午夜精品一区二区三区在线视| 在线亚洲欧美视频| 亚洲色图25p| 欧美精品性视频| 91伊人影院在线播放| 人人澡人人澡人人看欧美| 欧美日韩激情视频8区| 久久偷看各类女兵18女厕嘘嘘| 国产精品狼人色视频一区| 亚洲男人天堂网站| 日韩影视在线观看| 日韩精品在线电影| 亚洲精品久久久一区二区三区| 96pao国产成视频永久免费| 久久久久久久久久久av| 欧美伊久线香蕉线新在线| 中文字幕欧美精品日韩中文字幕| 日韩禁在线播放| 日韩精品免费综合视频在线播放| 日韩精品免费在线视频观看| 97免费视频在线播放| 国产亚洲一区精品| 一区二区三区久久精品| 国模吧一区二区| 国产一区视频在线播放| 亚洲成人av在线播放| 欧美福利小视频| 久久国产精品久久久久久| 亚洲一区二区三区在线视频| 国产精品视频专区| 久久这里只有精品视频首页| 91在线视频成人| 色午夜这里只有精品| 亚洲理论电影网| 亚洲美女久久久|