Android程式使用SOAP呼叫遠端WebService服務
在如今的應用程式中,不可能不使用到網路,並且後臺一定是有伺服器作為支撐的。如今最常見的呼叫方式有HTTP的GET ,POST方式,返回JSON或者XML資料。但是也有一種常見的形式就是呼叫WebService。現在我們來實現一下在Android端使用SOAP簡單物件訪問協議來呼叫WebService資料。主要的需求是根據某個手機號碼返回這個號碼的運營商,卡型別以及歸屬地等資訊。
(1)先從網上下載一個ksoap的jar包,放入專案的libs資料夾下,我也提供百度網盤的下載:http://pan.baidu.com/s/1o6svnC2 。
(2)推薦一個可以呼叫WebService的網站,上面提供了很多的服務,http://www.webxml.com.cn/zh_cn/index.aspx 。
(3)在Activity中的實現的程式碼如下:主要做介面顯示操作,並初始化一些WebService呼叫的引數,如URL地址,名稱空間,方法名稱,引數列表等。
package com.example.testwebservice2;
import java.util.HashMap;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class WebserviceActivity extends Activity {
private Context context;
private static final String URL = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx";// 請求的url
private static final String NAMESPACE = "http://WebXml.com.cn/";// 請求的名稱空間;
private static final String METHODNAME = "getMobileCodeInfo"; // 方法名稱,獲得國內手機號碼歸屬地省份,地區和手機卡型別資訊;
private EditText phoneNum;
private Button query;
private TextView showResult;
private Handler handler = new Handler() {// 重新整理介面;
public void handleMessage(Message msg) {
String myData = msg.getData().getString("data");// 這裡是完全解析好後的資料;用於顯示;
if (myData != null || !"".equals(myData)) {
showResult.setText(myData);
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
this.context = this;
initView();
query.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 手機號碼(段)
String phoneSec = phoneNum.getText().toString().trim();
// 簡單判斷使用者輸入的手機號碼(段)是否合法
if ("".equals(phoneSec) || phoneSec.length() < 7) {// 輸入不合法;
phoneNum.setError("您輸入的手機號碼(段)有誤!"); // 給出錯誤提示
phoneNum.requestFocus();
// 將顯示查詢結果的TextView清空
phoneNum.setText("");
return;
}
ResponseOnClick(); // 輸入沒問題,開始請求資料;
}
});
}
private void initView() {
phoneNum = (EditText) findViewById(R.id.phone_sec);
query = (Button) findViewById(R.id.query_btn);
showResult = (TextView) findViewById(R.id.result_text);
}
private void ResponseOnClick() {
HttpThread thread = new HttpThread(handler, context);
HashMap<String, Object> params = new HashMap<String, Object>();
String phoneSec = phoneNum.getText().toString().trim();// 電話號碼;
params.put("mobileCode", phoneSec);// mobileCode:字串,手機號碼,最少前七位數字;
params.put("userId", "");// 字串,免費使用者為空字串;
thread.doStart(URL, NAMESPACE, METHODNAME, params);
}
}
(4)新建一個執行緒類,繼承自Thread,主要做訪問WebService的網路操作。接收返回的資料並傳遞給Activity。
package com.example.testwebservice2;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
class HttpThread extends Thread {
private Handler handler = null;
private Context context = null;
private String url = null;
private String namespace = null;
private String methodName = null;
HashMap<String, Object> params = new HashMap<String, Object>();// 引數列表;
private ProgressDialog progressDialog = null;
// 建構函式
public HttpThread(Handler handler, Context context) {
this.handler = handler;
this.context = context;
}
/**
* 啟動執行緒
*/
/**
* 要向伺服器傳遞的四個引數分別是: (1)URL (2)名稱空間 (3)方法名 (4)引數列表
*
* @param url
* @param namespace
* @param methodName
* @param params
*/
public void doStart(String url, String namespace, String methodName,
HashMap<String, Object> params) {
this.url = url;
this.namespace = namespace;
this.methodName = methodName;
this.params = params;
progressDialog = ProgressDialog.show(context, "提示", "正在請求請稍等...", true);
this.start();// 啟動這個執行緒;
}
/**
* 執行緒執行
*/
@Override
public void run() {
try {
// web service 請求
SoapObject result = (SoapObject) CallWebService();
Log.i("HttpThread_getPropertyCount", result.getPropertyCount() + "");
Log.i("HttpThread_getProperty(0)", result.getProperty(0) + "");
// 構造資料
String value = null;
if (result != null && result.getPropertyCount() > 0) {
for (int i = 0; i < result.getPropertyCount(); i++) {
SoapPrimitive primitive = (SoapPrimitive) result
.getProperty(i);
value = primitive.toString();
}
/**
* 這裡獲得的value就是WebService的值: 18710498511:陝西 西安 陝西移動全球通卡
*/
// Log.i("HttpThread_value", value);
// 取消進度框
progressDialog.dismiss();
// 構造訊息
Message message = handler.obtainMessage();
Bundle bundle = new Bundle();
bundle.putString("data", value);// 傳遞到介面進行顯示;
message.setData(bundle);
handler.sendMessage(message);// 傳遞到到Activity的handmessage()中進行處理;
}// if
} catch (Exception e) {
e.printStackTrace();
}
}// run();
private Object CallWebService() {
String SOAP_ACTION = namespace + methodName;// 名稱空間+方法名稱;
SoapObject request = new SoapObject(namespace, methodName);// 建立SoapObject例項
// 生成呼叫web service 方法的soap請求訊息
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
// 設定.net web service
envelope.dotNet = true;
// 請求引數
if (params != null && !params.isEmpty()) {
for (Iterator it = params.entrySet().iterator(); it.hasNext();) {
Map.Entry<String, Object> e = (Entry) it.next();
request.addProperty(e.getKey().toString(), e.getValue());
}
}
// 傳送請求
envelope.setOutputSoapObject(request);
HttpTransportSE transport = new HttpTransportSE(url);
SoapObject result = null;
try {
// web service請求
transport.call(SOAP_ACTION, envelope);
result = (SoapObject) envelope.bodyIn;
} catch (Exception ex) {
ex.printStackTrace();
}
Log.i("result", result.toString());
return result;
}// CallWebService();
}// HttpThread類;
(5)程式執行結果如圖:
..
github主頁:https://github.com/chenyufeng1991 。歡迎大家訪問!
相關文章
- bbossaop遠端服務介紹-遠端服務呼叫例項
- PHP使用SOAP呼叫.net的WebService資料PHPWeb
- Webservice呼叫方式:axis,soap詳解Web
- bbossaop遠端服務介紹-點對點遠端服務呼叫和組播服務呼叫的區別
- dubbo 遠端服務無法呼叫
- python 搭建 webservice 服務端PythonWeb服務端
- Ajax通過SOAP協議呼叫Web服務協議Web
- (2)什麼是服務拆分和遠端呼叫
- ASP.NET如何定時呼叫WebService服務ASP.NETWeb
- PHP呼叫webservice遇到 Soap WSDL Error - "failed to load external entityPHPWebErrorAI
- 小白的學習筆記——服務拆分和遠端呼叫筆記
- apache cxf-2.4.3 +spring-3.0.5釋出SOAP協議WebService服務ApacheSpring協議Web
- Android中使用Android Ksoap2呼叫WebServiceAndroidWeb
- openlayer呼叫wms服務端服務端
- bbossaop遠端服務介紹-遠端服務id定義規則
- SOAP和WebService真是垃圾。Web
- Java呼叫使用SSL/HTTPS協議來傳輸的axis webservice服務JavaHTTP協議Web
- Restful是什麼,SOAP Webservice和RESTful WebserviceRESTWeb
- Android呼叫WebService詳解AndroidWeb
- 翻譯-使用Spring WebService生成SOAP Web ServiceSpringWeb
- Java建立WebService服務及客戶端實現JavaWeb客戶端
- 本地MinIO儲存服務Java遠端呼叫上傳檔案Java
- Android服務端開發之使用Eclipse搭建Java Web服務端Android服務端EclipseJavaWeb
- WebService Soap架構設計Web架構
- 本地除錯遠端服務除錯
- 《遠端控制》-服務端實現(一)服務端
- SpringCloud(一)微服務遠端呼叫 -- RestTemplateSpringGCCloud微服務REST
- 使用WebService釋出soap介面,並實現客戶端的https驗證Web客戶端HTTP
- soap協議的web服務協議Web
- spring cloud feign實現遠端呼叫服務傳輸檔案SpringCloud
- RPC框架/高效能遠端同步呼叫框架/分散式服務框架RPC框架分散式
- 關於iOS-WebService SOAP AFNetworking~> 2.6.3 XML傳參呼叫方法iOSWebXML
- Java建立WebService服務及客戶端實現(轉)JavaWeb客戶端
- bbossgroups2.0-RC版本中如何通過JGroups來實現叢集節點間遠端服務呼叫,或者多伺服器之間遠端服務呼叫伺服器
- spring 的遠端服務是?Spring
- Windows遠端連線Docker服務WindowsDocker
- webService 客戶端呼叫 axis2Web客戶端
- (文摘)徹底理解webservice SOAP WSDLWeb