okhttp详解

  1. OkHttp 是 Square 公司开发的一款高效、简洁的 HTTP 客户端库,广泛用于 Android 开发和 Java 后端,支持 HTTP/1.1、HTTP/2、WebSocket 等,以性能优异、易用性强著称。以下从核心特性、工作原理、使用方式等方面详解:

    一、核心特性

  2. 高效连接复用 通过连接池(ConnectionPool)复用 TCP 连接,减少握手开销(默认保持 5 个空闲连接,超时时间 5 分钟),尤其适合频繁请求的场景。

  3. 支持 HTTP/2多路复用(单连接并发处理多个请求)、头部压缩(HPACK),大幅提升性能。

  4. 拦截器机制 提供应用拦截器(Application Interceptor)和网络拦截器(Network Interceptor),可用于日志打印、请求加密、缓存控制等。

  5. 自动重试与重定向对某些失败的请求(如连接超时、5xx 状态码)自动重试,支持 HTTP 重定向(3xx 状态码)。

  6. 缓存支持 基于 HTTP 缓存协议(如 Cache-ControlETag)实现本地缓存,减少网络请求。

  7. 异步 / 同步请求 支持同步阻塞调用和异步回调(Callback),适配不同场景。

OkHttp 凭借其高效性和灵活性,成为网络请求的首选库,深入理解其原理和最佳实践能显著提升网络层代码质量。

三、基本使用示例

1. 依赖引入(Android)

gradle

复制代码
dependencies {
    implementation 'com.squareup.okhttp3:okhttp:4.12.0' // 最新版本可更新
}
2. 同步 GET 请求

java

运行

复制代码
OkHttpClient client = new OkHttpClient();

String run(String url) throws IOException {
    Request request = new Request.Builder()
        .url(url)
        .build();

    try (Response response = client.newCall(request).execute()) {
        return response.body().string(); // 注意:body() 只能调用一次
    }
}
3. 异步 POST 请求(带表单参数)

java

运行

复制代码
OkHttpClient client = new OkHttpClient();

void post(String url, String json) {
    MediaType JSON = MediaType.parse("application/json; charset=utf-8");
    RequestBody body = RequestBody.create(JSON, json);
    Request request = new Request.Builder()
        .url(url)
        .post(body)
        .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 {
            try (ResponseBody responseBody = response.body()) {
                if (!response.isSuccessful()) {
                    throw new IOException("Unexpected code " + response);
                }
                // 处理响应(注意:Android 中需切换到主线程更新 UI)
                String result = responseBody.string();
            }
        }
    });
}

四、拦截器使用

拦截器可串联执行,常用于统一处理逻辑:

java

运行

复制代码
OkHttpClient client = new OkHttpClient.Builder()
    .addInterceptor(new LoggingInterceptor()) // 应用拦截器
    .addNetworkInterceptor(new CacheInterceptor()) // 网络拦截器
    .build();

class LoggingInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        // 打印请求信息
        Log.d("OkHttp", "Request: " + request.url());
        // 执行请求
        Response response = chain.proceed(request);
        // 打印响应信息
        Log.d("OkHttp", "Response: " + response.code());
        return response;
    }
}

五、注意事项

ResponseBody 处理body().string() 会消耗流,不可重复调用;大文件建议用 byteStream() 逐步读取。 线程安全OkHttpClient 是线程安全的,建议全局共享一个实例,避免重复创建。 Android 网络权限 :需在 AndroidManifest.xml 中添加 <uses-permission android:name="android.permission.INTERNET" />异步回调线程onResponseonFailure 运行在子线程,更新 UI 需切换到主线程(如用 HandlerCoroutine)。

2. 工作流程(以异步请求为例)

构建 OkHttpClientRequest 对象。 通过 OkHttpClient.newCall(request) 创建 RealCallCall 的实现类)。 调用 enqueue(Callback),将任务提交到 Dispatcher(调度器)。 Dispatcher 管理线程池,分配线程执行请求:

  • 检查缓存,命中则直接返回缓存响应。
  • 未命中则通过 ConnectionPool 获取或创建连接。
  • 经拦截器链处理(如重试、重定向、网络请求)后获取响应。

响应通过 Callback 回调到主线程(Android 中需配合 Handler)。

二、核心组件与工作流程

1. 核心类

OkHttpClient :客户端实例,配置全局参数(连接超时、拦截器、缓存等),线程安全,建议全局单例。 Request :请求对象,包含 URL、方法(GET/POST)、头信息、请求体等。 Response :响应对象,包含状态码、头信息、响应体(ResponseBody)等。 Call :请求执行的抽象,由 OkHttpClient.newCall(request) 创建,支持 execute()(同步)和 enqueue(Callback)(异步)。 Interceptor:拦截器接口,用于处理请求 / 响应的中间过程。 。

相关推荐
天花板之恋3 天前
Android http网络请求的那些事儿
http·okhttp
Entropless3 天前
解剖OkHttp:那些主流教程未曾深入的设计精髓
android·okhttp
介一安全4 天前
【Frida Android】实战篇3:基于 OkHttp 库的 Hook 抓包
android·okhttp·网络安全·frida
峰哥的Android进阶之路5 天前
Okhttp原理总结
okhttp
椰羊sqrt8 天前
CVE-2025-4334 深度分析:WordPress wp-registration 插件权限提升漏洞
android·开发语言·okhttp·网络安全
0和1的舞者8 天前
网络通信的奥秘:HTTP详解 (七)
服务器·网络·网络协议·http·okhttp·软件工程·1024程序员节
爱怪笑的小杰杰11 天前
浏览器端缓存地图请求:使用 IndexedDB + ajax-hook 提升地图加载速度
ajax·okhttp·缓存
没有故事、有酒11 天前
Ajax介绍
前端·ajax·okhttp