访问后台服务端资源是企业移动应用的必备功能。Android 自身的库中包含有 Apache Http Client 库,可以用来访问 Rest API, 但因为网络访问比较耗时,为保持UI的流畅,Android 不允许在主线程(MainThread) 访问网络的,所以网络相关的操作都需要是异步的,虽然 Android 标准库中提供了有些方式帮助完成异步处理,但都比较复杂。本文演示使用 AsyncHttpClient 库来简化开发工作。
AsyncHttpClient 是一个开源的实现。官网
安装 AsyncHttpClient
在 app 模块的 build.gradle 文件的 dependencies 块中加入 AsyncHttpClient 的依赖:
1
| implementation 'com.loopj.android:android-async-http:1.4.9'
|
Android Stuido 会自动下载相关的依赖库。
申请网络权限
在 AndroidManifest.xml 中加入以下代码,为应用程序申请网络权限
1 2
| <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
使用 POST 方法
使用 AsyncHttpClient 时,我们首先建立一个 AsyncHttpClient 的实例。 然后调用 addHeader 加入需要的 head 信息(通常需要查看后端接口定义)。然后执行对应的 http 方法。 在示例中,演示执行 POST 方法。
执行的结果是以回调的方式进行处理的。具体就是需要实现 HttpResponseHandler 接口,在该接口中,包含一些方法,典型的就是: onSuccess - 当调用成功时会被执行,onFailure - 当调用失败时会被执行。
在示例代码中,按照通常的 rest api 设计方式,以 json 对象作为返回值,所以直接使用了 JsonHttpResponseHandler。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| AsyncHttpClient client = new AsyncHttpClient(); client.addHeader("Content-Type", "application/json"); client.addHeader("--auth-token--", "0123456789"); client.post( "https://xxxxx/api/todo/list", null, new JsonHttpResponseHandler() {
@Override public void onSuccess(int statusCode, Header[] headers, JSONObject response) { try { if (response.getBoolean("succ")) { JSONArray data = response.getJSONArray("data"); tvwCount.setText("count = " + data.length()); } } catch(Exception e) { Log.e(TAG, "fail to parse result", e); } }
@Override public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) { Log.e(TAG, "Error when access server: ", throwable); } });
|
在Reqeust中添加参数
AsyncHttpClient 提供了一个 RequestParams 作为管理请求参数的类。但它适用于参数是 Form 形式的情况,如果在Body中是 json 对象(字符串),有该如何呢?
- 首先构造一个 JSONObject 对象作为保存参数的实体
- 把参数赋值到 JSONObject 中
- 将 JSONObject 转换为 StirngEntity (这实际上是 HttpClient 中的一个参数类型)
- 调用对应的 HTTP 方法
示例代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| AsyncHttpClient client = new AsyncHttpClient(); client.addHeader("Content-Type", "application/json"); client.addHeader("--auth-token--", "0123456789");
JSONObject jsonParams = new JSONObject(); try { jsonParams.put("title", "task20"); jsonParams.put("desc", "description for task20"); jsonParams.put("completed", "false"); StringEntity entity = new StringEntity(jsonParams.toString());
client.post(this, "https://xxxx/api/todos/add", entity, "application/json", new JsonHttpResponseHandler() {
@Override public void onSuccess(int statusCode, Header[] headers, JSONObject response) { Log.d(TAG, "response = " + response); try { if (response.getBoolean("succ")) { } } catch(Exception e) { Log.e(TAG, "fail to parse result", e); } }
@Override public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) { Log.e(TAG, "Error when access server: ", throwable); } }); } catch(Exception e) { Log.e(TAG, "Fail to add task: ", e); }
|