OkHttp ——适用于 Android 和 Java 应用程序的 HTTP, HTTP/2 的客户端

OkHttp ——适用于 Android 和 Java 应用程序的 HTTP, HTTP/2 的客户端

OkHttp 是一个处理网络请求轻量级框架,是一个精巧的网络请求库。

有如下特性:

  • 支持 HTTP2 / SPDY( SPDY 是 Google 开发的基于 TCP 的传输层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验。)
  • socket 自动选择最好路线,并支持自动重连,拥有自动维护的 socket 连接池,减少握手次数,减少了请求延迟,共享 Socket , 减少对服务器的请求次数。
  • 基于 Headers 的缓存策略减少重复的网络请求。
  • 拥有 Interceptors 轻松处理请求与响应(自动处理 GZip 压缩)。

功能:

  • Get, Post, Put, Delete 请求。
  • 文件的上传下载。
  • 加载图片 (内部会图片大小自动压缩)
  • 支持请求回调,直接返回对象、对象集合
  • 支持 session 的保持

它的请求/响应使用构造器模式来设计,支持阻塞式的同步请求和带回调的异步请求。

OkHttp 3.12.x 版本支持Android 2.3(API level 9)和 Java 7 以上的版本。

使用 OkHttp

1. 依赖与权限

在项目的 build.gradle 中添加 OkHttp 依赖


dependencies {
    ...

    api 'com.squareup.okhttp3:okhttp:3.12.0'
}

在 AndroidManifest.xml 中增加网络权限。




2. 异步 POST 发送 json 数据请求

下面是一个参考DEMO。

通过异步 POST json 数据异步请求服务器返回。


public class FaceRecognizer {
    private static String mUrl = "http://192.168.1.200:8001/get_license";

    private static final OkHttpClient sHttpClient = new OkHttpClient();
    public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");

    public void recognize_async(String key_msg) {
        JSONObject json = new JSONObject();

        try {
            json.put("public_key", key_msg);
        } catch (JSONException e) {
            Log.e(TAG, "recognize: ", e);
            return;
        }

        RequestBody body = RequestBody.create(JSON, json.toString());
        Request request = new Request.Builder()
                .url(mUrl)
                .post(body)
                .build();

        // 异步 enqueue
        sHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                // 处理错误信息
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                ResponseBody body = response.body();
                if (body != null) {
                    // 处理从服务器获取到的信息
                }
                response.close();
            }
        });
    }
}

主要参数和字段的说明如下:

参数 说明 备注
MediaType 传递数据的 MIME 类型,包含 type、subtype、charset(字符集) 。常用有 json(application/json)、xml(application/xml)、png(image/png)等。 Media Type 参考
OkhttpClient OkHttp 对外的 API,包含很多功能模块
Request 代表一个 Http 请求。一但创建将不可修改,需要使用 Builder 模式进行构造
Request.Builder().post Http 请求采用 POST 不使用时默认为 GET 请求
enqueue 异步请求,将请求放入队列中处理。返回时会更加情况回调 onFailure 或 onResponse 接口

3. 同步 GET 发送请求


    public void recognize_sync() {
        Request request = new Request.Builder()
                .url(mUrl)
                .get()          // 默认 GET 请求,可以不添加
                .build();

        // 同步 execute
        final Call call = okHttpClient.newCall(request);
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Response response = call.execute();
                    ResponseBody body = response.body();
                    if (body != null) {
                        // 处理从服务器获取到的信息
                    }
                    response.close();
                } catch (IOException e) {
                    // 处理错误信息
                }
            }
        }).start();
    }

由于同步请求会阻塞线程,而 Android 后续规定在主线程不允许进行网络阻塞。

所以想要运行同步请求,需要在其它线程内运行。

总结

自此,可以简单使用 OkHttp 实现 GET / POST 异步和同步的网络请求了。

需要注意的是,OkHttpClient 对象最好共享(建议使用单例模式创建)。

因为每个 OkHttpClient 开销较大(有自己的线程池和连接池),重复创建容易爆内存。

如果还需要使用如 DELETE、文件上传下载等,可以查询 官方网站 和 Java 接口说明文档

你可能感兴趣的:(Android,Android,okhttp3,okhttp,HTTP)