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