[Android開發實踐]搭建本地API服務器與HTTP請求調用

目的

在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服務器搭建

首先是服務器環境,由於要實現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!"}}架構

也能夠經過請求此接口,驗證服務器是否搭建運行正確。


Android配置HOST

其次是實現對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接口請求

最後,建立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應用開發環境,並讓其初步運行起來,把總體流程跑通。代碼都只是示例性的代碼,應該在後期逐漸完善和重構。

相關文章
相關標籤/搜索