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 天前
ICAN_PARENT
okhttp
XiaoLeisj3 天前
Android 短视频项目首页开发实战:从广场页广告轮播与网格列表,到发现页分类、播单与话题广场的数据驱动实现
android·okhttp·mvvm·recyclerview·retrofit·databinding·xbanner 轮播
.豆鲨包6 天前
【Android】OkHttp的使用及封装
android·java·okhttp
华科易迅6 天前
Vue通过Ajax获取后台路由信息
vue.js·ajax·okhttp
studyForMokey7 天前
【Android面试】OkHttp & Retrofit 专题
android·okhttp·面试
fLDiSQV1W8 天前
springMVC-HTTP消息转换器与文件上传、下载、异常处理
网络协议·http·okhttp
Ttang2312 天前
Java爬虫:Jsoup+OkHttp实战指南
java·爬虫·okhttp
李庆政37012 天前
OkHttp的基本使用 实现GET/POST请求 authenticator自动认证 Cookie管理 请求头设置
java·网络协议·http·okhttp·ssl
无名-CODING13 天前
Java 爬虫进阶:动态网页、多线程与 WebMagic 框架实战
java·爬虫·okhttp
小李云雾14 天前
零基础-从ESS6基础到前后端联通实战
前端·python·okhttp·中间件·eclipse·html·fastapi