使用 AsyncHttpClient 库访问 Rest API

访问后台服务端资源是企业移动应用的必备功能。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 对象(字符串),有该如何呢?

  1. 首先构造一个 JSONObject 对象作为保存参数的实体
  2. 把参数赋值到 JSONObject 中
  3. 将 JSONObject 转换为 StirngEntity (这实际上是 HttpClient 中的一个参数类型)
  4. 调用对应的 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);
}

本文标题:使用 AsyncHttpClient 库访问 Rest API

文章作者:Morning Star

发布时间:2019年08月14日 - 11:08

最后更新:2021年04月16日 - 15:04

原始链接:https://www.mls-tech.info/app/android/android-rest-api-with-aysnchttpclient/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。