在Android開發下,能夠實現app對特定API服務器進行接口請求。php
如今不少項目都是基於C/S架構,因此在我的開發過程須要搭建相似的開發測試環境。列舉一下本次的環境:html
開發環境:Window 7 + Eclipse + ADT (假設已搭建好Android開發環境)
java
Server:Ubuntu 11.10 + Nginx + PHP (運行在虛擬機)android
Client::Android 2.3
shell
以下圖所示:
ubuntu
溫暖提示:api
若是虛擬機ping不通,請檢測是否在同一個網段,如不是須要修改爲橋接模式,並檢查防火牆設置。
服務器
首先是服務器環境,由於要實現API開發,因此這裏使用了本人以前自主開發的PHP框架(請參考:zenphpWS3 :自主開發的PHP Web Services輕量級開發框架),暫時不考慮業務實現,只是利用這個框架在LAMP環境上快速構建一個API接口環境,並實現簡單的響應。這裏不使用Hello World接口,由於框架有默認的接口。這裏配置的服務器域名爲:http://dogstar.api.shakenext.com/,請求此域名,默認下會返回:網絡
{"status":"OK","data":"Welcome to use zenphpWS3!","error":"","debug":{"msg":"This is default service!"}}架構
也能夠經過請求此接口,驗證服務器是否搭建運行正確。
其次是實現對API的調用請求。因爲請求的是本地測試環境的域名,因此能夠經過配置修改Android上的HOST來保證正確請求。但須要修改Android上的HOST須要ROOT權限,因此請參考ROOT權限獲取相關的操做。獲取後,能夠經過adb來驗證,以下即表示root權限獲取成功。
E:\>adb shell $ su su #
隨後將android上的HOSTS保存在本地電腦,使用命令:
adb pull /system/etc/hosts G:/
最好指定保存的路徑,以避免找不到。
編輯hosts文件,添加API服務器的IP:
127.0.0.1 localhost #ubuntu 192.168.0.100 dogstar.api.shakenext.com
注意,在配置HOST時,域名最後須要換行,不然會致使域名不能正常解析。
在第一次導入hosts文件到Android系統前,須要修改hosts文件的權限,不然會提示無權限。使用如下命令:
E:\>adb shell $ su su #chmod 777 /system/etc/hosts
再使用如下命令導入host文件:
adb push G:\hosts /system/etc/hosts
進入Android驗證:
$ ping dogstar.api.shakenext.com ping dogstar.api.shakenext.com PING dogstar.api.shakenext.com (192.168.0.100) 56(84) bytes of data. 64 bytes from dogstar.api.shakenext.com (192.168.0.100): icmp_seq=1 ttl=64 time=1914 ms 64 bytes from dogstar.api.shakenext.com (192.168.0.100): icmp_seq=2 ttl=64 time=2445 ms
最後,建立Android應用,並實現接口請求。
打開Eclipse後,File->New->Android Application Project->項目名稱->繼續下一步。
建立完成後,爲了實現對接口的HTTP請求,這裏參考了Android Http請求方法彙總 ,稍微改動了一下,以下所示:
package com.dogstar.shakenext.util; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class ApiClient { public static String executeHttpGet(String requestUrl) { String result = null; URL url = null; HttpURLConnection connection = null; InputStreamReader in = null; try { //url = new URL("http://10.0.2.2:8888/data/get/?token=alexzhou"); url = new URL(requestUrl); connection = (HttpURLConnection) url.openConnection(); in = new InputStreamReader(connection.getInputStream()); BufferedReader bufferedReader = new BufferedReader(in); StringBuffer strBuffer = new StringBuffer(); String line = null; while ((line = bufferedReader.readLine()) != null) { strBuffer.append(line); } result = strBuffer.toString(); } catch (Exception e) { e.printStackTrace(); } finally { if (connection != null) { connection.disconnect(); } if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } return result; } }
將如下調用的代碼放置在可運行的位置,如按鈕響應,測試一下接口請求。
Log.v("[TRACE]", "onClick"); String rs = ApiClient.executeHttpGet("http://dogstar.api.shakenext.com/"); Log.v("[TRACE]", "api result" + rs);
正常運行並響應後,能夠LOG看到如下的輸出:
06-28 11:43:42.425: V/[TRACE](4947): onClick 06-28 11:43:42.755: V/[TRACE](4947): api result{"status":"OK","data":"Welcome to use zenphpWS3!","error":"","debug":{"msg":"This is default service!"}}
若是出現UnknowHostException,請檢測是否已在AndroidManifest.xml添加網絡權限:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
至此,搭建完成。Enjoy your coding!
這裏只是講述快速搭建一個須要聯網Android應用開發環境,並讓其初步運行起來,把總體流程跑通。代碼都只是示例性的代碼,應該在後期逐漸完善和重構。