当前位置: 首页 > news >正文

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() {@Overridepublic void onFailure(Call call, IOException e) {e.printStackTrace();}@Overridepublic 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 {@Overridepublic 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" />异步回调线程onResponse 和 onFailure 运行在子线程,更新 UI 需切换到主线程(如用 Handler 或 Coroutine)。

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

构建 OkHttpClient 和 Request 对象。 通过 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:拦截器接口,用于处理请求 / 响应的中间过程。 。

http://www.dtcms.com/a/606433.html

相关文章:

  • 云防火墙如何实现多层网络防护
  • 智能家居为什么推荐使用UWB,UWB能够实现什么功能?
  • 海尔网站的建设特点自建网站餐饮服务提供者应在通信主管部门备案后
  • 不会被封的网站谁做免费空间有哪些
  • 30.计算云服务
  • AI赋能的$AIOT:打造Web3全周期智能生态的价值核心
  • 【算法】定义和类别
  • 如东网站建设lnmp wordpress 安装
  • 【C++】AVL 树
  • c++之基础A(无返回函数)第三课
  • 温州网站建设温州网站制作百度禁止seo推广
  • 南宁市网站开发公司电话wordpress wp-login
  • 合肥制作手机网站中国供求网
  • Nine.fun|从极致用户体验到社区自治的价值闭环
  • 淘宝客做的最好的网站怎么弄一个网站平台
  • 华为OD机试 双机位A卷 - 项目排期 / 最少交付时间 (JAVA Python C++ JS GO)
  • websocket操作入门
  • Golang学习笔记:定时crontab
  • Go语言编译器源码分析
  • LeetCode hot100:021 合并两个有序链表:两种解法的深入剖析
  • 做二手车网站需要什么手续费wordpress 批量换
  • 【基于 Spring Cloud Alibaba 的微服务电商项目】完整实现思路
  • 2025中国密码学会年会“人才培养论坛”成功举办,产学共探密码人才培育新路径
  • 高质量网站外链建设大揭秘网址收录大全
  • 网站建设的数字化和互联网化建设局工作怎么样
  • resource 和 K8S 对接部分 apifox
  • C语言编译器下载地址 | 提供多种C语言编译工具下载链接与使用指南
  • 网站备案跟网安备案区别展厅设计制作
  • 公司建立网站流程图开原网站制作
  • Python工程师的职业发展路径:专家访谈