[Android开发实践]搭建本地API服务器与HTTP请求调用

吃可爱长大的小学妹 提交于 2019-11-30 08:58:03

目的

在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应用开发环境,并让其初步运行起来,把整体流程跑通。代码都只是示例性的代码,应该在后期逐渐完善和重构。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!