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

OkHttpClient 详解(Android/Java 最常用 HTTP 客户端)

OkHttp是 Square 公司开发的高效、轻量、稳定的 HTTP/HTTPs 客户端,是 Android 开发、Java 后端最主流的网络请求库,替代了原生的 HttpURLConnection。

它的核心优势:

  • 支持 HTTP/2、连接池、GZIP 自动压缩、缓存
  • 同步 / 异步请求、拦截器(日志、请求头统一处理)
  • 超时、重连、错误处理完善
  • 安卓项目几乎必用,也是 Retrofit 的底层依赖

一、快速集成(Gradle)

1. Android / Java 项目依赖

最新稳定版(以官方为准):

gradle

// OkHttp 核心 implementation 'com.squareup.okhttp3:okhttp:4.12.0' // 可选:日志拦截器(查看请求/响应日志) implementation 'com.squareup.okhttp3:logging-interceptor:4.12.0'

2. 权限(Android 必备)

AndroidManifest.xml添加:

xml

<uses-permission android:name="android.permission.INTERNET" />

二、基础使用(最常用 4 种请求)

1. 创建全局 OkHttp 实例(推荐单例)

OkHttp 官方强烈建议全局单例,避免重复创建连接池导致性能问题:

java

运行

import okhttp3.OkHttpClient; import java.util.concurrent.TimeUnit; public class HttpUtil { // 全局单例 OkHttpClient public static final OkHttpClient OK_HTTP_CLIENT = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) // 连接超时 .readTimeout(10, TimeUnit.SECONDS) // 读取超时 .writeTimeout(10, TimeUnit.SECONDS) // 写入超时 // .addInterceptor(new LogInterceptor()) // 自定义拦截器 .build(); }

2. GET 请求(异步 → 安卓推荐)

java

运行

// 1. 构建 Request Request request = new Request.Builder() .url("https://api.github.com/users/octocat") .get() // GET 请求(默认可不写) .addHeader("token", "xxx") // 请求头 .build(); // 2. 异步请求(不阻塞主线程) HttpUtil.OK_HTTP_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()) { String result = response.body().string(); // 处理结果 } response.close(); // 必须关闭 } });

3. POST 请求(表单提交)

java

运行

// 构建表单参数 RequestBody formBody = new FormBody.Builder() .add("username", "test") .add("password", "123456") .build(); // 构建请求 Request request = new Request.Builder() .url("https://xxx.com/login") .post(formBody) .build(); // 执行请求(同上异步)

4. POST 请求(JSON 提交)

java

运行

// JSON 字符串 String json = "{\"name\":\"okhttp\",\"age\":18}"; // 构建请求体 RequestBody requestBody = RequestBody.create( json, MediaType.parse("application/json; charset=utf-8") ); Request request = new Request.Builder() .url("https://xxx.com/api") .post(requestBody) .build();

三、高级功能

1. 日志拦截器(调试神器)

添加依赖后直接使用,可打印完整请求 / 响应

java

运行

HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); logging.setLevel(HttpLoggingInterceptor.Level.BODY); // 打印全部信息 OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(logging) .build();

2. 拦截器统一处理(请求头、Token)

java

运行

public class HeaderInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { Request original = chain.request(); // 所有请求统一添加请求头 Request newRequest = original.newBuilder() .header("Content-Type", "application/json") .header("Authorization", "Bearer " + getToken()) .method(original.method(), original.body()) .build(); return chain.proceed(newRequest); } }

3. 文件上传

java

运行

// 文件 File file = new File("path/test.jpg"); // 构建多部分请求体 RequestBody requestBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("file", file.getName(), RequestBody.create(file, MediaType.parse("image/jpeg"))) .build(); Request request = new Request.Builder() .url("https://xxx.com/upload") .post(requestBody) .build();

四、注意事项(必看)

  1. response.body().string()只能调用一次内部是流,读取后会关闭,多次调用会抛异常。
  2. Android 不能在主线程做同步请求同步execute()会触发NetworkOnMainThreadException,必须用异步enqueue()
  3. 必须关闭 Response否则会造成资源泄漏,建议try-finally关闭。
  4. 单例使用不要每次请求都new OkHttpClient()

总结

  1. OkHttp是 Java/Android 最稳定高效的 HTTP 客户端
  2. 支持GET/POST/JSON/ 文件上传 / 拦截器 / 缓存
  3. 安卓开发必须用异步请求,避免主线程阻塞
  4. 最佳实践:全局单例 + 拦截器统一处理
http://www.jsqmd.com/news/896615/

相关文章:

  • 基于图嵌入与LCG相似性的固件漏洞检测技术解析
  • 长沙包包回收店推荐三家高价好店变现省心、快捷无套路,心念奢品稳居前列 - 断舍离奢侈品测评站
  • 长沙二手奢侈品回收测评:5 家高变现门店推荐,心念奢品第一,壹刻时韵紧随其后 - 断舍离奢侈品测评站
  • 2026黄岩装修公司测评:真实数据告诉你谁是top10! - 疯一样的风
  • 运营矩阵系统实战指南:从“人管号“到“系统管号“的效率跃迁
  • 5个免费AI音频黑科技:在Audacity本地运行OpenVINO插件终极指南
  • 智能体驱动声明式架构:用自然语言实现K8s与云原生自动化
  • 2026年深圳电池厂家推荐排行榜:18650/21700锂电池,无人机/机器人/电动工具电池,比克/松下/三星/LG/亿纬电池品牌深度解析 - 企业推荐官【官方】
  • 2026年阀门/黄铜阀门/铸铁阀门/不锈钢阀门/暖通阀门/消防阀门厂家推荐榜单:高密封与强耐腐实力工厂重磅盘点 - 企业推荐官【官方】
  • ESMFold蛋白质结构预测实用指南:从单链到多链的完整解决方案
  • 异构集群DAG任务调度优化:从HEFT算法到遗传算法的工程实践
  • 告别格式混乱:手把手教你用LaTeX的\appendix和\appendices命令搞定IEEE论文附录
  • 2026 东莞钻石回收行情解析,收的顶真实测评 - 奢侈品回收测评
  • 调试以太网PHY必看:用FPGA抓取MDIO总线数据,排查自协商失败的实战技巧
  • 别再只会updateTopic了!RocketMQ 5.1.1 Topic管理命令实战:从创建、监控到删除的完整操作流
  • CentOS 7内核升级实战:从版本选择到规避‘pstore: unknown compression: deflate’启动报错
  • 暗黑破坏神2存档编辑器d2s-editor终极指南:快速掌握角色管理工具
  • 【ROS实战】Gazebo环境配置与性能优化全攻略
  • 2026年水表厂家精选推荐榜:智能水表/4G无线水表/NB物联网水表/超声波水表/预付费IC卡水表/大口径法兰水表/不锈钢水表/干式湿式螺翼式水表源头品牌选购指南 - 企业推荐官【官方】
  • 2026中卫市本地人必选的公共卫生检测专业机构TOP5推荐!美容院、足疗店、酒店宾馆卫生检测、许可证办理,正规CMA资质检测公司排名推荐 (2026年5月商铺卫生办证最新深度调研方案) - 防水补漏3
  • 概率计算WebApp实验室:概率分布、随机模拟与AI推演系统
  • 可扩展数字串行求逆器:为超低功耗密码学硬件“瘦身”
  • 2026内江市本地人必选的公共卫生检测专业机构TOP5推荐!美容院、足疗店、酒店宾馆卫生检测、许可证办理,正规CMA资质检测公司排名推荐 (2026年5月商铺卫生办证最新深度调研方案) - 防水补漏3
  • 避坑指南:在RV1126的Buildroot系统上为GC2053 MIPI摄像头添加驱动,一次点亮不翻车
  • 广州靠谱国际机票预订公司|正规 IATA 资质,口碑实力双在线,一站式预订避坑指南 - 土星买买买
  • 2026淄博市本地人必选的公共卫生检测专业机构TOP5推荐!美容院、足疗店、酒店宾馆卫生检测、许可证办理,正规CMA资质检测公司排名推荐 (2026年5月商铺卫生办证最新深度调研方案) - 防水补漏3
  • 2026最新Word转图片保姆级教程:免费方法手把手教你一看就会
  • 别再手动移植了!用STM32CubeMX 6.8.1 + Keil MDK 5分钟搞定FreeRTOS到STM32F103
  • 如何快速构建个人数字图书馆:番茄小说下载器专业实战指南
  • 未来荧黑字体:3分钟学会中文设计字体安装与配置的终极指南