OkHttp用法-Java调用http服务

特点:高性能,支持异步请求,连接池优化

官方文档:提供快速入门指南和高级功能(如拦截器、连接池)的详细说明,GitHub仓库包含丰富示例。

社区资源:中文教程丰富,GitHub高星标(40k+),社区活跃度高,问题响应快。

维护状态:由Square公司持续维护,更新频繁,支持最新TLS和HTTP/2特性。

// 1. 添加 Maven 依赖
// <dependency>
//     <groupId>com.squareup.okhttp3</groupId>
//     <artifactId>okhttp</artifactId>
//     <version>4.9.3</version>
// </dependency>import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;public class OkHttpExample {public static void main(String[] args) {OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url("https://api.example.com/data").build();try (Response response = client.newCall(request).execute()) {if (response.isSuccessful()) {String result = response.body().string();System.out.println("Response: " + result);}} catch (Exception e) {e.printStackTrace();}}
}

OkHttp 核心用法详解(从基础到实战)

一、基础用法
1. 创建 OkHttpClient 实例
// 基础配置(可扩展代理、超时等)
OkHttpClient client = new OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS) // 连接超时.readTimeout(30, TimeUnit.SECONDS)    // 读取超时.writeTimeout(30, TimeUnit.SECONDS)   // 写入超时.retryOnConnectionFailure(true)      // 连接失败自动重试.build();
2. 构建请求(GET 示例)
Request request = new Request.Builder().url("https://api.example.com/data").header("User-Agent", "OkHttp Example") // 添加请求头.get() // 默认是GET,可省略.build();
3. 发送请求
  • 同步请求(阻塞当前线程):

    try (Response response = client.newCall(request).execute()) {if (response.isSuccessful()) {String result = response.body().string();System.out.println("Response: " + result);} else {System.out.println("Error: " + response.code());}
    } catch (IOException e) {e.printStackTrace();
    }
    
  • 异步请求(非阻塞,通过回调处理):

    client.newCall(request).enqueue(new Callback() {@Overridepublic void onResponse(Call call, Response response) throws IOException {if (response.isSuccessful()) {String result = response.body().string();System.out.println("Async Response: " + result);}}@Overridepublic void onFailure(Call call, IOException e) {e.printStackTrace();}
    });
    
二、POST 请求与数据提交
1. 提交 JSON 数据
public static final MediaType JSON = MediaType.get("application/json; charset=utf-8");String jsonBody = "{\"key1\":\"value1\", \"key2\":\"value2\"}";
RequestBody body = RequestBody.create(jsonBody, JSON);Request request = new Request.Builder().url("https://api.example.com/post").post(body).build();
2. 提交表单数据
RequestBody formBody = new FormBody.Builder().add("username", "user").add("password", "pass").build();Request request = new Request.Builder().url("https://api.example.com/login").post(formBody).build();
三、文件上传与下载
1. 文件上传(Multipart)
File file = new File("path/to/file.jpg");
RequestBody fileBody = RequestBody.create(file, MediaType.parse("image/jpeg"));RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("file", file.getName(), fileBody).addFormDataPart("description", "Test upload").build();Request request = new Request.Builder().url("https://api.example.com/upload").post(requestBody).build();
2. 文件下载
Request request = new Request.Builder().url("https://api.example.com/file.zip").build();try (Response response = client.newCall(request).execute()) {if (response.isSuccessful()) {byte[] fileData = response.body().bytes();Files.write(Paths.get("downloaded.zip"), fileData);}
}
四、高级功能
1. 拦截器(Logging & Header 修改)
// 日志拦截器
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);// 自定义 Header 拦截器
Interceptor headerInterceptor = chain -> {Request originalRequest = chain.request();Request newRequest = originalRequest.newBuilder().header("Authorization", "Bearer token123").build();return chain.proceed(newRequest);
};OkHttpClient client = new OkHttpClient.Builder().addInterceptor(logging).addInterceptor(headerInterceptor).build();
2. 连接池配置(优化性能)
ConnectionPool pool = new ConnectionPool(5, 5, TimeUnit.MINUTES); // 最大空闲连接5,保持5分钟
OkHttpClient client = new OkHttpClient.Builder().connectionPool(pool).build();
五、最佳实践
  1. 复用 OkHttpClient 实例:避免频繁创建/销毁,减少资源开销。
  2. 异步请求优先:在 Android 等 UI 线程受限环境中,必须使用异步请求。
  3. 合理配置超时:根据业务场景调整 connectTimeoutreadTimeout
  4. 使用拦截器统一处理:日志、错误重试、Header 添加等逻辑集中管理。
  5. 大文件下载用流式处理:避免 response.body().string() 导致内存溢出,改用 response.body().byteStream() 逐块读取。
六、常见问题
  • Q:如何取消正在进行的请求?
    A:调用 Call.cancel(),需在回调中检查 isCanceled()

  • Q:如何处理 HTTPS 证书问题?
    A:通过 CertificatePinner 配置证书固定,或自定义 X509TrustManager(需谨慎)。

  • Q:OkHttp 与 Retrofit 的关系?
    A:Retrofit 是基于 OkHttp 的 RESTful 客户端封装,提供更简洁的 API 调用方式。


通过以上内容,您已掌握 OkHttp 的核心用法,可根据项目需求灵活选择同步/异步请求、配置拦截器、优化连接池,实现高效稳定的网络通信。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/905739.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python中常用的参数以及命名规范

以下是 Python 中常见的命名规范、参数用法及在大型项目中常用的操作模式&#xff0c;供记录参考&#xff1a; 1. 命名规范&#xff08;Naming Conventions&#xff09; 前缀/形式含义示例_age单下划线&#xff1a;弱“私有”标记&#xff08;可访问但不建议外部使用&#xff…

第五十七篇 Java接口设计之道:从咖啡机到智能家居的编程哲学

目录 引言&#xff1a;生活中的接口无处不在一、咖啡机与基础接口&#xff1a;理解抽象契约1.1 咖啡制作的标准接口 二、智能家居与策略模式&#xff1a;灵活切换实现2.1 温度调节策略场景 三、物流系统与工厂模式&#xff1a;标准接口下的多样实现3.1 快递运输接口设计 四、健…

第二十六天打卡

全局变量 global_var 全局变量是定义在函数、类或者代码块外部的变量&#xff0c;它在整个程序文件内都能被访问。在代码里&#xff0c; global_var 就是一个全局变量&#xff0c;下面是相关代码片段&#xff1a; print("\n--- 变量作用域示例 ---") global_var …

联合查询

目录 1、笛卡尔积 2、联合查询 2.1、内连接 2.2、外连接 1、笛卡尔积 笛卡尔积&#xff1a; 笛卡尔积是让两个表通过排列组合的方式&#xff0c;得到的一个更大的表。笛卡尔积的列数&#xff0c;是这两个表的列数相加&#xff0c;笛卡尔积的行数&#xff0c;是这两个表的行…

【HTML5学习笔记2】html标签(下)

1表格标签 1.1表格作用 显示数据 1.2基本语法 <table><tr> 一行<td>单元格1</td></tr> </table> 1.3表头单元格标签 表头单元格会加粗并且居中 <table><tr> 一行<th>单元格1</th></tr> </table&g…

window 显示驱动开发-分页视频内存资源

与 Microsoft Windows 2000 显示驱动程序模型不同&#xff0c;Windows Vista 显示驱动程序模型允许创建比可用物理视频内存总量更多的视频内存资源&#xff0c;然后根据需要分页进出视频内存。 换句话说&#xff0c;并非所有视频内存资源都同时位于视频内存中。 GPU 的管道中可…

《C 语言指针高级指南:字符、数组、函数指针的进阶攻略》

目录 一. 字符指针变量 二. 数组指针变量 三. 二维数组传参 3.1 二维数组的本质 3.2 访问方式与地址计算 3.3 二维数组的传参方式 3.4 深入解析 *(*(arri)j) 与 arr[i][j] 的等价性 四. 函数指针变量 4.1 函数指针变量的创建 4.2 函数指针变量的使用 4.3 两段"…

Unity:场景管理系统 —— SceneManagement 模块

目录 &#x1f3ac; 什么是 Scene&#xff08;场景&#xff09;&#xff1f; Unity 项目中的 Scene 通常负责什么&#xff1f; &#x1f30d; 一个 Scene 包含哪些元素&#xff1f; Scene 的切换与管理 &#x1f4c1; 如何创建与管理 Scenes&#xff1f; 什么是Scene Man…

内容中台重构企业知识管理路径

智能元数据驱动知识治理 现代企业知识管理的核心挑战在于海量非结构化数据的有效治理。通过智能元数据分类引擎&#xff0c;系统可自动识别文档属性并生成多维标签体系&#xff0c;例如将技术手册按产品版本、功能模块、适用场景进行动态标注。这种动态元数据框架不仅支持跨部…

Vue3:脚手架

工程环境配置 1.安装nodejs 这里我已经安装过了&#xff0c;只需要打开链接Node.js — Run JavaScript Everywhere直接下载nodejs&#xff0c;安装直接一直下一步下一步 安装完成之后我们来使用电脑的命令行窗口检查一下版本 查看npm源 这里npm源的地址是淘宝的源&#xff0…

悦数图数据库一体机发布,让复杂关联计算开箱即用

在金融风控、政务治理、能源监测等关键领域&#xff0c;复杂数据关联分析已成为业务决策的核心需求。然而&#xff0c;信创场景的特殊性——全栈自主可控、海量实时计算、系统高可用性——对传统技术架构提出了近乎苛刻的要求。悦数图数据库一体机应运而生&#xff0c;以软硬协…

收放卷“材料停机减速距离“计算FC(算法公式+ST源代码+C++代码)

PLC运动控制基础系列之梯形速度曲线 PLC运动控制基础系列之梯形速度曲线_三菱运动控制模块梯形加减速-CSDN博客文章浏览阅读3.2k次,点赞3次,收藏7次。本文是关于PLC运动控制的基础教程,重点介绍了梯形速度曲线的概念、计算和应用。讨论了梯形加减速在启动和停止阶段的作用,…

Centos7系统(最小化安装)安装zabbix7版本详细文章、nginx源代码配置、php源代码、mysql-yum安装

zabbix官网链接下载zabbix源代码安装包 选择zabbix版本&#xff08;此文章使用zabbix7.0版本&#xff09; 安装之前由于是最小化安装centos7安装一些开发环境和工具包 文章使用国内阿里源 cd /etc/yum.repos.d/;curl -O https://mirrors.aliyun.com/repo/epel-7.repo;curl -…

描述性统计图表

一、核心图表类型与用途 1、直方图(Histogram) (1)定义:用连续矩形表示数据分布,横轴为数据区间,纵轴为频数或频率。 (2)用途:展示数据分布形态(对称、偏态)、识别离群值。 (3)适用场景:分析连续型变量的分布特征,如收入分布、考试成绩分布。 2、箱线图(Box P…

ThinkPad X250电池换电池芯(理论技术储备)

参考&#xff1a;笔记本电池换电芯的经验与心得分享 - 经典ThinkPad专区 - 专门网 换电池芯&#xff0c;需要克服以下问题&#xff1a; 1 拆电池。由于是超声波焊接&#xff0c;拆解比较费力&#xff0c;如果暴力撬&#xff0c;有可能导致电池壳变形... 2 替换电池芯的时候如…

Java(基础) day01 初识Java

目录 一、运行Java程序 二、基本数据类型 1、整数类型 ​编辑2、浮点型 3、字符型 4、布尔类型 一、运行Java程序 Java是一门半编译型、半解释型语言。先通过javac编译程序把xxx.java源文件进行编译&#xff0c;编译后生成的.class文件是由字节码组成的平台无关、面向JVM的文…

【美团】Java后端一面复盘|网络+线程+MySQL+Redis+设计模式+手撕算法

&#x1f4cd; 面试公司&#xff1a;美团 &#x1f3af; 面试岗位&#xff1a;Java后端开发工程师 &#x1f4de; 面试形式&#xff1a;电话面试 &#x1f552; 面试时长&#xff1a;约 50 分钟 &#x1f501; 面试轮次&#xff1a;第一轮技术面 ✨ 面试整体节奏&#xff1a; …

Go语言八股文之Mysql锁详解

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

实战案例:采集 51job 企业招聘信息

本文将带你从零开始&#xff0c;借助 Feapder 快速搭建一个企业级招聘信息数据管道。在“基础概念”部分&#xff0c;我们先了解什么是数据管道和 Feapder&#xff1b;“生动比喻”用日常场景帮助你快速理解爬虫组件&#xff1b;“技术场景”介绍本项目中如何使用代理等采集策略…

GMT之Bash语言使用

GMT的操作有自己的逻辑和“命令”&#xff0c;但GMT是可以用Bash语言控制的&#xff0c;所以常常以.sh为后缀写GMT程序。 GMT程序运行步骤如下&#xff1a; 采用cd &#xff0c;定位到指定文件夹&#xff1b;以sh ***.sh运行GMT&#xff0c;得到结果。 另外&#xff0c;遇到…