目的
在Android开发下,可以实现app对特定API服务器进行接口请求。
场景
现在很多项目都是基于C/S架构,所以在个人开发过程需要搭建类似的开发测试环境。列举一下本次的环境:
开发环境:Window 7 + Eclipse + ADT (假设已搭建好Android开发环境)
Server:Ubuntu 11.10 + Nginx + PHP (运行在虚拟机)
Client::Android 2.3
如下图所示:
温暖提示:
如果虚拟机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应用开发环境,并让其初步运行起来,把整体流程跑通。代码都只是示例性的代码,应该在后期逐渐完善和重构。
来源:oschina
链接:https://my.oschina.net/u/256338/blog/284959