news 2026/5/27 12:20:22

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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. 最佳实践:全局单例 + 拦截器统一处理
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/27 12:19:58

图片转Word最简单方法是什么?2026年保姆级教程,3种方式手把手教你搞定

你是不是也遇到过这种情况——手机里存着一堆图片&#xff0c;上面全是有用的文字内容&#xff0c;比如会议记录的拍照、纸质合同、读书笔记、PPT截图&#xff0c;想把里面的字提取出来变成可以编辑的Word文档,结果对着电脑敲了半小时才录完一页&#xff1f;或者老板临时甩过来…

作者头像 李华
网站建设 2026/5/27 12:18:13

SpiNNaker:异步事件驱动架构与神经形态计算的编程模型解析

1. 项目概述&#xff1a;SpiNNaker的颠覆性设计哲学在并行计算的常规叙事里&#xff0c;我们总是绕不开几个“金科玉律”&#xff1a;内存一致性、全局同步、确定性的消息传递。这些概念构成了现代多核与分布式系统的基石&#xff0c;仿佛离开了它们&#xff0c;大规模计算就无…

作者头像 李华
网站建设 2026/5/27 12:16:14

别再手动移植了!用STM32CubeMX 6.8.1 + Keil MDK 5分钟搞定FreeRTOS到STM32F103

5分钟极速部署FreeRTOS&#xff1a;STM32CubeMX 6.8.1与Keil MDK的完美协作方案1. 现代嵌入式开发的效率革命记得三年前我第一次尝试在STM32F103上移植FreeRTOS时&#xff0c;整整花了两天时间——手动复制文件、修改启动代码、调整链接脚本&#xff0c;最后还要解决一堆莫名其…

作者头像 李华
网站建设 2026/5/27 12:16:13

5分钟解锁专业级法线贴图:零门槛在线工具完全指南

5分钟解锁专业级法线贴图&#xff1a;零门槛在线工具完全指南 【免费下载链接】NormalMap-Online NormalMap Generator Online 项目地址: https://gitcode.com/gh_mirrors/no/NormalMap-Online NormalMap-Online是一款基于WebGL技术的免费在线法线贴图生成器&#xff0c…

作者头像 李华
网站建设 2026/5/27 12:16:09

MOCQA:为GQAP问题设计的原生硬件加速器,性能与能效双突破

1. 项目概述&#xff1a;为什么我们需要一个专用的GQAP硬件加速器&#xff1f;在物流规划、芯片布局、网络集群调度这些实际工程问题背后&#xff0c;常常隐藏着一个共同的数学幽灵&#xff1a;广义二次分配问题。简单来说&#xff0c;它就像是在玩一个超级复杂的“连连看”加“…

作者头像 李华
网站建设 2026/5/27 12:13:19

MLCRP:基于重用距离谱与机器学习的GPU缓存性能快速建模

1. 项目概述与核心挑战在GPU这类高性能计算架构的设计与优化中&#xff0c;缓存性能的评估一直是个让人又爱又恨的环节。爱的是&#xff0c;一个微小的缓存配置调整&#xff0c;可能带来显著的性能提升&#xff1b;恨的是&#xff0c;为了评估这个调整&#xff0c;你可能需要面…

作者头像 李华