当前位置: 首页 > 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.zskr.cn/news/1402641.html

相关文章:

  • 长沙二手奢侈品回收测评:5 家高变现门店推荐,心念奢品第一,壹刻时韵紧随其后 - 断舍离奢侈品测评站
  • 【MATLAB】水声通信信道均衡与解码程序仿真
  • 2026黄岩装修公司测评:真实数据告诉你谁是top10! - 疯一样的风
  • 2026中卫市本地人必选的公共卫生检测专业机构TOP5推荐!美容院、足疗店、酒店宾馆卫生检测、许可证办理,正规CMA资质检测公司排名推荐 (2026年5月商铺卫生办证最新深度调研方案) - 防水补漏3
  • 从蓝桥杯模拟赛2的PWM控制题,深入理解STM32 HAL库定时器重装载值与比较值的动态设置技巧
  • Unity GLTF导入3大难题:如何用GLTFUtility实现零错误配置?
  • STM32CubeMX HAL库隐藏技能:深入SysTick滴答定时器,自己写个精准的毫秒级非阻塞延时模块
  • 广州靠谱国际机票预订公司|正规 IATA 资质,口碑实力双在线,一站式预订避坑指南 - 土星买买买
  • 全域运营矩阵系统:跨平台协同的底层架构与落地路径
  • 三分钟看懂 OPC 中国的商业模式与社会价值
  • BES2500YP平台音频调试避坑指南:高速串口、2M波特率与AUDIO_DUMP工具配置全流程
  • Fusion 360 3D打印螺纹设计终极指南:告别传统螺纹烦恼
  • 二分查找法实例应用的细节分析
  • 程序员如何在AI时代保持竞争力:2026年的生存指南
  • 2026年4月国内优秀的工业冷却塔公司推荐,冷却塔/方形逆流冷却塔/冷却塔填料/圆形逆流冷却塔,工业冷却塔订制厂家推荐 - 品牌推荐师
  • 从Hubel Wiesel到MViT:视觉Transformer如何‘抄袭’了大脑的层次化处理?
  • 融合SOA与语义Web的智能家居系统:从感知到认知的架构实践
  • 三步打造你的职业围棋AI分析助手:LizzieYzy完整使用指南
  • 金华黄金回收六强实力解析:福昌夏领跑上门高价榜 - 黄金上门回收
  • QuickLook.Plugin.OfficeViewer-Native:Windows用户必备的Office文件快速预览终极方案
  • 5分钟解锁专业级法线贴图:零门槛在线工具完全指南
  • 如何用pk3DS轻松打造个性化宝可梦游戏:完整指南与实战教程
  • 多人协作表格哪个好用?2026年最新工具答案来了
  • SF6综合测试仪:国产替代SF6综合测试仪的精密化进阶与自主实践
  • 边缘物联网节点容器化能耗实测:Docker在电池供电场景下的代价与优化
  • 国际机票代理哪家强?实测3家龙头:第一名武汉圣擎,售后无人能及! - 土星买买买
  • 3分钟解锁网易云音乐NCM加密文件:ncmdump终极解密指南
  • 3个被忽略的习惯断点,正在悄悄废掉你的ChatGPT生产力:即刻启用「Prompt-Action-Review」三阶追踪表
  • 实战解析——基于硬布线控制的24指令单周期MIPS CPU核心设计
  • 避开蒙特卡洛仿真的巨量计算:用LTSpice几步实现高效的最坏情况分析