Android 呼叫 WebService
本節引言:
經過前面的學習,資料請求,資料解析,檔案上傳下載等,應該滿足大家與伺服器互動的基本 需求了,而本節介紹給大家的Android呼叫WebService,其實這玩意有點類似一些提供給我們 原始資料API服務的資料平台,例如聚合資料!而WebService則用到了XML和SOAP,透過HTTP協議 即可完成與遠端機器的互動!嗯,不多說,開始本節內容~
WebService簡介
PS:如果看完上面簡介還不是很清楚的話,那就算了,之前公司就用C#搭的一個WebService! 本節我們不討論如何建立一個WebService,我們只知道如何去取得WebService提供的服務, 然後解析返回的XML數據,然後把相關數據顯示到我們的Android設備上就好!
2.去哪裡取得WebService服務
網路上有很多提供WebService的站點,先找到這些站點,然後取得對應的服務即可! 這裡選取WebXml和雲聚36wu作為範例給大家講解下,他們的官網:
webXml:http://www.webxml.com.cn/zh_cn/index .aspx
以前是免費的,不過都商業化了,很多服務都要收費,但是可以試用~ 改站點上提供了16個不同的Web服務,可以依照自己的需求,查詢對應服務,呼叫不同的介面!
webXml的相關頁面:
#相關使用次數說明:
雲聚36wu:http://www.36wu.com/Service
也提供了很多的服務,很多手機的app都是用的這裡的介面,比如彩虹公車,手機天氣等 不過,這個也是要收費的=-=,可以試用,不過只能一小時內發送20次請求; 點擊申請使用,獲得key就可以了!兩者隨便選一個吧!
#3.第三方jar包的準備
首先如果想在Android平台上呼叫WebService需要依賴第三方類別庫:ksoap2 而在Android平台上,使用的是ksoap2 Android,一個高效,輕量級的SOAP開發包!
#jar包下載地址:https://code.google.com/p/ksoap2 -android/wiki/HowToUse?tm=2
天朝可能上不去,這裡提供兩個百度雲的連結供大家下載使用:
2.54版本:ksoap2-android 2.54.jar
3.30版本:ksoap2-android 3.30.jar
如果您希望你能進入jar包的下載地址的話,那麼你會看到下面的介面:
4.取得相關的一些參數
#首先找到我們需要取得的服務,然後記錄相關的參數:NameSpace(命名空間),SoapAction以及URL就不用說了,其他參數這樣找:
例如我們這裡找的是天氣的查詢參數,點進去我們可以看到這樣一個參數文件:
例如這裡我們需要的是天氣查詢部分的功能:
先把框住的SoapAction和NameSpace拷貝下來!當然我們可以在這個頁面測試,另外 我們是免費用戶,id可以不填直接跳過,輸入後點擊調用按鈕會打開這樣一個頁面:
#嘿嘿,這裡就是返回的XML,而我們要做的也就是解析這樣一個XML,另外這裡的 .gif代表的是天氣圖示!
同理,我們再把歸屬地查詢的看下SoapAction,NameSpace以及相關參數mark下!
以及傳回後的XML資料:
5.註冊並啟用相關WEB服務
#點擊我的網路伺服器,然後點擊試用,WebXML給了我們五天的免費試用, 我們把需要的兩個伺服器開啟!
好的,記得mark下我們自己的key哦~
6.呼叫WebService的程式碼範例
#嗯,接下來我們來寫程式碼驗證調用WebService的流程:
執行效果圖:
#PS:這個號碼是先前的號碼=-=,別嘗試撥打,已經換人了~ 另外天氣服務好像有寫問題,有時並不能取得到,估計是WebXml做的一些限制, 畢竟試試...
實作程式碼:
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private EditText edit_param; private Button btn_attribution; private Button btn_weather; private TextView txt_result; private String city; private String number; private String result; //定义获取手机信息的SoapAction与命名空间,作为常量 private static final String AddressnameSpace = "http://WebXml.com.cn/"; //天气查询相关参数 private static final String Weatherurl = "http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx"; private static final String Weathermethod = "getWeather"; private static final String WeathersoapAction = "http://WebXml.com.cn/getWeather"; //归属地查询相关参数 private static final String Addressurl = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx"; private static final String Addressmethod = "getMobileCodeInfo"; private static final String AddresssoapAction = "http://WebXml.com.cn/getMobileCodeInfo"; //定义一个Handler用来更新页面: private Handler handler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case 0x001: txt_result.setText("结果显示:\n" + result); Toast.makeText(MainActivity.this, "获取天气信息成功", Toast.LENGTH_SHORT).show(); break; case 0x002: txt_result.setText("结果显示:\n" + result); Toast.makeText(MainActivity.this, "号码归属地查询成功", Toast.LENGTH_SHORT).show(); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bindViews(); } private void bindViews() { edit_param = (EditText) findViewById(R.id.edit_param); btn_attribution = (Button) findViewById(R.id.btn_attribution); btn_weather = (Button) findViewById(R.id.btn_weather); txt_result = (TextView) findViewById(R.id.txt_result); btn_attribution.setOnClickListener(this); btn_weather.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_weather: new Thread() { @Override public void run() { getWether(); } }.start(); break; case R.id.btn_attribution: new Thread(new Runnable() { public void run() { getland(); } }).start(); break; } } //定义一个获取某城市天气信息的方法: public void getWether() { result = ""; SoapObject soapObject = new SoapObject(AddressnameSpace, Weathermethod); soapObject.addProperty("theCityCode:", edit_param.getText().toString()); soapObject.addProperty("theUserID", "dbdf1580476240458784992289892b87"); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.bodyOut = soapObject; envelope.dotNet = true; envelope.setOutputSoapObject(soapObject); HttpTransportSE httpTransportSE = new HttpTransportSE(Weatherurl); System.out.println("天气服务设置完毕,准备开启服务"); try { httpTransportSE.call(WeathersoapAction, envelope); // System.out.println("调用WebService服务成功"); } catch (Exception e) { e.printStackTrace(); // System.out.println("调用WebService服务失败"); } //获得服务返回的数据,并且开始解析 SoapObject object = (SoapObject) envelope.bodyIn; System.out.println("获得服务数据"); result = object.getProperty(1).toString(); handler.sendEmptyMessage(0x001); System.out.println("发送完毕,textview显示天气信息"); } //定义一个获取号码归属地的方法: public void getland() { result = ""; SoapObject soapObject = new SoapObject(AddressnameSpace, Addressmethod); soapObject.addProperty("mobileCode", edit_param.getText().toString()); soapObject.addProperty("userid", "dbdf1580476240458784992289892b87"); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.bodyOut = soapObject; envelope.dotNet = true; envelope.setOutputSoapObject(soapObject); HttpTransportSE httpTransportSE = new HttpTransportSE(Addressurl); // System.out.println("号码信息设置完毕,准备开启服务"); try { httpTransportSE.call(AddresssoapAction, envelope); //System.out.println("调用WebService服务成功"); } catch (Exception e) { e.printStackTrace(); //System.out.println("调用WebService服务失败"); } //获得服务返回的数据,并且开始解析 SoapObject object = (SoapObject) envelope.bodyIn;//System.out.println("获得服务数据"); result = object.getProperty(0).toString();//System.out.println("获取信息完毕,向主线程发信息"); handler.sendEmptyMessage(0x001); //System.out.println("发送完毕,textview显示天气信息"); } }
另外,別忘了導引包和Internet的權限!
參考程式碼下載:
WebServiceDemo.zip:下載WebServiceDemo.zip
##本節小結:
好的,本節關於Android端如何去使用這個WebService就講到這裡,下一節我們來學習一個 類似瀏覽器的Android控制-WebView,敬請期待~謝謝~!#