Java中使用OkHttp进行高效的HTTP请求

2025-04发布5次浏览

Java中使用OkHttp进行高效的HTTP请求

1. OkHttp简介

OkHttp是一个高效的HTTP客户端,用于Java和Android应用。它支持同步和异步调用、连接池、GZIP压缩、缓存等特性,使得网络请求更加高效和简单。

OkHttp由Square公司开发,并且被广泛应用于各种场景,如API调用、文件上传下载等。它还提供了丰富的功能,比如拦截器、超时设置、重试机制等。

2. OkHttp的安装与配置

在Java项目中使用OkHttp,可以通过Maven或Gradle引入依赖。

Maven依赖:
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.9.3</version>
</dependency>
Gradle依赖:
implementation 'com.squareup.okhttp3:okhttp:4.9.3'

3. 同步GET请求示例

以下是一个简单的同步GET请求示例:

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

import java.io.IOException;

public class OkHttpExample {
    public static void main(String[] args) {
        OkHttpClient client = new OkHttpClient();

        Request request = new Request.Builder()
                .url("https://jsonplaceholder.typicode.com/posts/1")
                .build();

        try (Response response = client.newCall(request).execute()) {
            if (response.isSuccessful() && response.body() != null) {
                System.out.println(response.body().string());
            } else {
                System.out.println("Request failed: " + response.code());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

解释:

  • 创建OkHttpClient实例。
  • 使用Request.Builder构建请求对象。
  • 调用client.newCall(request).execute()执行同步请求。
  • 处理响应结果并打印。

4. 异步GET请求示例

异步请求允许程序在等待网络响应时继续执行其他任务。

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

import java.io.IOException;

public class OkHttpAsyncExample {
    public static void main(String[] args) {
        OkHttpClient client = new OkHttpClient();

        Request request = new Request.Builder()
                .url("https://jsonplaceholder.typicode.com/posts/1")
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                e.printStackTrace();
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful() && response.body() != null) {
                    System.out.println(response.body().string());
                } else {
                    System.out.println("Request failed: " + response.code());
                }
            }
        });
    }
}

解释:

  • enqueue(Callback)方法用于发起异步请求。
  • onResponse回调中处理成功的响应。
  • onFailure回调中处理失败的情况。

5. POST请求示例

发送POST请求时,可以使用RequestBody来构建请求体。

import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

import java.io.IOException;

public class OkHttpPostExample {
    public static void main(String[] args) {
        OkHttpClient client = new OkHttpClient();

        MediaType JSON = MediaType.get("application/json; charset=utf-8");
        String json = "{\"title\":\"foo\",\"body\":\"bar\",\"userId\":1}";

        RequestBody body = RequestBody.create(json, JSON);
        Request request = new Request.Builder()
                .url("https://jsonplaceholder.typicode.com/posts")
                .post(body)
                .build();

        try (Response response = client.newCall(request).execute()) {
            if (response.isSuccessful() && response.body() != null) {
                System.out.println(response.body().string());
            } else {
                System.out.println("Request failed: " + response.code());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

解释:

  • 使用MediaType指定内容类型为JSON。
  • 构建RequestBody对象,并将其附加到请求中。
  • 使用.post(body)方法发送POST请求。

6. 拦截器的使用

OkHttp支持拦截器,可以在请求发送前或响应接收后对数据进行处理。

import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

import java.io.IOException;

public class OkHttpInterceptorExample {
    public static void main(String[] args) {
        OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(new LoggingInterceptor())
                .build();

        Request request = new Request.Builder()
                .url("https://jsonplaceholder.typicode.com/posts/1")
                .build();

        try (Response response = client.newCall(request).execute()) {
            if (response.isSuccessful() && response.body() != null) {
                System.out.println(response.body().string());
            } else {
                System.out.println("Request failed: " + response.code());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    static class LoggingInterceptor implements Interceptor {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request();

            long t1 = System.nanoTime();
            System.out.println(String.format("Sending request %s on %s%n%s",
                    request.url(), chain.connection(), request.headers()));

            Response response = chain.proceed(request);

            long t2 = System.nanoTime();
            System.out.println(String.format("Received response for %s in %.1fms%n%s",
                    response.request().url(), (t2 - t1) / 1e6d, response.headers()));

            return response;
        }
    }
}

解释:

  • 自定义LoggingInterceptor类实现日志记录功能。
  • OkHttpClient.Builder中添加拦截器。

7. 扩展知识

  • 连接池:OkHttp默认使用连接池,减少每次请求建立新连接的开销。
  • 超时设置:可以通过OkHttpClient.Builder设置读取、写入和连接超时时间。
  • 缓存:OkHttp支持响应缓存,可以减少重复请求的网络流量。