Bootstrap

老榕树的Java专题:OKhttp

        OKHttp 是一个处理网络请求的开源库,在 Android 和 Java 开发中被广泛使用,以下是它的一些常见用法:

一、添加依赖

       如果是 Java 项目使用 Maven 构建,在 pom.xml 文件中添加依赖:

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>版本号</version>
</dependency>

二、发起简单的 GET 请求

        以下是使用 OKHttp 发起一个简单的 GET 请求的基本步骤及代码示例:

        1.创建 OkHttpClient 实例OkHttpClient 是用于执行网络请求的客户端类,通常创建一个全局的实例即可。

OkHttpClient client = new OkHttpClient();

        2.构建请求对象:使用 Request 类构建请求对象,指定请求的 URL

Request request = new Request.Builder()
       .url("https://www.example.com/api/data")
       .build();

        3.发起请求并获取响应:通过客户端实例调用 newCall 方法创建一个 Call 对象,然后执行 execute 方法发起同步请求,获取响应。

try {
    Call call = client.newCall(request);
    Response response = call.execute();
    if (response.isSuccessful()) {
        String responseBody = response.body().string();
        System.out.println("响应内容: " + responseBody);
    } else {
        System.out.println("请求失败,状态码: " + response.code());
    }
} catch (IOException e) {
    e.printStackTrace();
}

上述代码中:

  • 首先创建 OkHttpClient 实例作为请求客户端。
  • 接着构建 Request 对象,指定了请求的目标网址。
  • 然后通过客户端发起请求并获取响应,若响应成功(isSuccessful 判断),则获取响应体内容并输出;若失败,则输出相应的状态码。

        需要注意的是,同步请求会阻塞当前线程,一般建议在非 UI 线程(比如 Android 中的子线程)中执行此类操作,避免阻塞主线程导致界面卡顿等问题。

三、发起 POST 请求

        发起 POST 请求时,通常需要设置请求体(例如提交表单数据、JSON 数据等),以下是示例代码:

        1.创建 OkHttpClient 实例(同 GET 请求步骤)

OkHttpClient client = new OkHttpClient();

        2.构建请求对象(包含设置请求体)

        假设要提交 JSON 格式的数据,先创建 JSON 格式的请求体,再构建 Request 对象。

MediaType mediaType = MediaType.get("application/json; charset=utf-8");
String json = "{\"key1\":\"value1\",\"key2\":\"value2\"}";
RequestBody requestBody = RequestBody.create(json, mediaType);

Request request = new Request.Builder()
       .url("https://www.example.com/api/submit")
       .post(requestBody)
       .build();

在上述代码中:

  • 首先通过 MediaType 定义了请求体的数据类型为 JSON 格式。
  • 然后创建了包含实际数据的 RequestBody 对象。
  • 最后构建 Request 对象时,使用 post 方法设置请求体,表明这是一个 POST 请求。

        发起请求并获取响应(同 GET 请求的响应获取方式类似)

try {
    Call call = client.newCall(request);
    Response response = call.execute();
    if (response.isSuccessful()) {
        String responseBody = response.body().string();
        System.out.println("响应内容: " + responseBody);
    } else {
        System.out.println("请求失败,状态码: " + response.code());
    }
} catch (IOException e) {
    e.printStackTrace();
}

四、异步请求

        为了避免阻塞线程,更常用的是异步请求方式,以下是使用 OKHttp 进行异步请求的示例代码:

        1.创建 OkHttpClient 实例(同前面步骤)

OkHttpClient client = new OkHttpClient();

        2.构建请求对象(同前面相应请求类型的构建方式)

        例如构建一个 GET 请求对象:

Request request = new Request.Builder()
       .url("https://www.example.com/api/data")
       .build();

        3.发起异步请求

client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        // 请求失败时的回调处理
        System.out.println("请求失败: " + e.getMessage());
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        if (response.isSuccessful()) {
            String responseBody = response.body().string();
            // 在异步回调中对成功响应进行处理,比如更新UI(在Android中需切换到主线程处理UI更新)
            System.out.println("响应内容: " + responseBody);
        } else {
            System.out.println("请求失败,状态码: " + response.code());
        }
    }
});

        在异步请求中,通过 enqueue 方法将请求加入队列并异步执行,当请求完成后会根据成功或失败分别调用 onResponse 或 onFailure 回调方法,方便在其中进行相应的后续处理。

五、设置请求头

        可以在构建请求对象时设置请求头信息,例如设置用户代理(User-Agent)等常见的请求头,以下是示例代码:

Request request = new Request.Builder()
       .url("https://www.example.com/api/data")
       .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36")
       .build();

        通过多次调用 header 方法可以添加多个不同的请求头字段及对应的值,以满足不同的请求需求和服务器要求。

六、处理连接超时等配置

        可以对 OkHttpClient 进行一些配置,比如设置连接超时时间、读取超时时间、写入超时时间等,示例代码如下:

OkHttpClient client = new OkHttpClient.Builder()
       .connectTimeout(10, TimeUnit.SECONDS)
       .readTimeout(10, TimeUnit.SECONDS)
       .writeTimeout(10, TimeUnit.SECONDS)
       .build();

        在上述代码中,使用 OkHttpClient.Builder 来构建客户端实例,并通过相应的方法设置了连接、读取、写入的超时时间都为 10 秒,这样可以避免因为网络问题导致请求长时间阻塞等情况发生。

;