使用 OkHttp

OkHttp 是 Android 目前最流行的网络请求库,有很多厂商支持,其他包括 Google。 由于 OkHttp 比较底层,市场上还有一些基于 OkHttp 封装的网络请求库,例如 Retrofit 等..

OkHttp Github 的地址是 。 使用 OkHttp,第一步需要在 app/build.gradle 这个文件导入依赖。

dependencies {
    ...
    // 当前最新版本是 4.10.0,这句代码可以在 OkHttp 的 Github 文档获得
    // 写上这句代码,别忘了点一下上面的 sync now 按钮更新依赖
    implementation 'com.squareup.okhttp3:okhttp:4.9.0'
    ...
}

完成了 OkHttp 依赖的更新,还需要开启一下安卓的用户网络权限,在 AndroidManifest.xml 文件添加下面这句:

<uses-permission android:name="android.permission.INTERNET" />

OkHttp 异步 Get 请求

我们在 MainActivity.java 新建一个 getAsync() 的方法,通过 httpbin.org 这个服务器,作为我们的测试地址。 httpbin.org 有很多的方法,/get?a=b 方法,我们提交什么 get 参数过去,就会返回什么 get 参数。

private void getAsync() {
    OkHttpClient okHttpCline = new OkHttpClient();
    Request request = new Request.Builder().url("https://httpbin.org/get?a=b").build();
    Call call = okHttpCline.newCall(request);
    call.enqueue(new Callback() {
        @Override
        public void onFailure(@NotNull Call call, @NotNull IOException e) {
            // 请求失败调用
            Log.d("okHttp", e.getMessage());
        }

        @Override
        public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
            // 请求成功调用
            Log.d("okHttp", "onResponse");
            // 获取 body 数据
            String body = response.body().string();
            Log.d("okHttp", body);
        }
    });
}

请求成功,就会执行到 onResponse 方法,我们通过 response.body().string() 获取到 body 的数据,是一个 JSON 对象,接下来,我们可以通过 JSONObject 对象进行 JSON 数据解析。

public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
    // 获取 body 数据
    if (response.isSuccessful()) {
        String body = response.body().string();
        // JSON 解析
        try {
            JSONObject jsonObj = new JSONObject(body);
            String args = jsonObj.getString("args");
            Log.d("okHttp", args);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

OkHttp 异步 Post Form 表单请求

我们在新建一个 postAsync 方法,同样用 httpbin.org 这个服务器作为测试服务器,这次我们使用的是 https://httpbin.org/post 接口。

private void postAsync() {
    OkHttpClient okHttpClient = new OkHttpClient();
    // 构建表单数据
    FormBody formBody = new FormBody.Builder().add("a", "1").add("b", "2").build();
    // 构建 Request 请求
    Request request = new Request.Builder().post(formBody).url("https://httpbin.org/post").build();
    Call call = okHttpClient.newCall(request);
    call.enqueue(new Callback() {
        @Override
        public void onFailure(@NotNull Call call, @NotNull IOException e) {

        }

        @Override
        public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
            String JSONStr = response.body().string();
            Log.d("okHttp", JSONStr);
        }
    });
}

我们使用 FormBody 构建的其实是对应了 http 的 x-www-form-urlencoded 方法,这是一种 post 提交数据的常见方法,如果我们需要提交文件,那就需要用到 form-data 方法。

form-data 上传文件

上传文件需要使用到 MultipartBody 对象,同时还需要用到 RequestBody 构建图片对象。

private void Upload() {
    Log.d("okHttp", "start Upload");
    OkHttpClient okHttpClient = new OkHttpClient();
    File file1 = new File("C:\\Users\\Admin\\Desktop\\1.txt");
    // 构建 multipart 数据
    // 数据有两个部分,一个是 a:b 的参数,和一个 txt 文件
    MultipartBody multipartBody = new MultipartBody.Builder().addFormDataPart("a", "1")
            .addFormDataPart("file1", file1.getName(), RequestBody.create(file1, MediaType.parse("text/plain"))).build();
    // 构建 request 请求
    Request request = new Request.Builder().post(multipartBody).url("https://httpbin.org/post").build();
    Call call = okHttpClient.newCall(request);
    call.enqueue(new Callback() {
        @Override
        public void onFailure(@NotNull Call call, @NotNull IOException e) {
        }

        @Override
        public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
            String JSONStr = response.body().string();
            Log.d("okHttp", JSONStr);
        }
    });
}

Post JSON 数据

发送 JSON 数据比较简单,使用 RequestBody 对象构建 JSON 数据到 post 方法里就可以。

private void postJson() {
    OkHttpClient okHttpClient = new OkHttpClient();
    RequestBody requestBody = RequestBody.create("{\"a\": 1, \"b\": 2}", MediaType.parse("application/json"));
    Request request = new Request.Builder().url("https://httpbin.org/post").post(requestBody).build();
    Call call = okHttpClient.newCall(request);
    call.enqueue(new Callback() {
        @Override
        public void onFailure(@NotNull Call call, @NotNull IOException e) {

        }

        @Override
        public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
            Log.d("okHttp", response.body().string());
        }
    });
}