SpringBoot实战(三十)发送HTTP/HTTPS请求的五种实现方式【下篇】(Okhttp3、RestTemplate、Hutool)

目录

    • 一、五种实现方式对比结果
    • 二、Demo接口地址
    • 实现方式三、Okhttp3 库实现
      • 3.1 简介
      • 3.2 Maven依赖
      • 3.3 配置文件
      • 3.4 配置类
      • 3.5 工具类
      • 3.6 示例代码
      • 3.7 执行结果
    • 实现方式四、Spring 的 RestTemplate 实现
      • 4.1 简介
      • 4.2 Maven依赖
      • 4.3 配置文件
      • 4.4 配置类
      • 4.5 HttpClient 和 RestTemplate 对比
      • 4.6 示例代码
        • 1)GET请求
          • 1.1)不带请求头的 GET 请求:
          • 1.2)带请求头的 GET 请求:
          • 1.3)文件下载的 GET 请求:
        • 2)POST请求
          • 2.1)普通 POST 请求:
          • 2.2)文件上传的 POST 请求:
    • 实现方式五:Hutool-http 工具包
      • 5.1 简介
      • 5.2 Maven 依赖
      • 5.3 示例代码

前言:

  • 在日常工作和学习中,有很多地方都需要发送 HTTP/HTTPS 请求,本文介绍了几种常用的实现方式,供大家参考,收藏不迷路。

由于篇幅问题,本篇文章分为上、下两篇,链接如下:

  • 【上篇】HttpURLConnection、HttpClient
  • 【下篇】Okhttp3、RestTemplate、Hutool

一、五种实现方式对比结果

为了方便大家选择适合自己的实现方式,先展示五种实现方式的对比结果:

实现方式底层依赖优点缺点
HttpURLConnectionJava标准库 (java.net)1、不需要外部依赖
2、能够直接访问java.net.URL类的功能。
1、功能相对有限。
2、需要手动管理很多资源(如打开和关闭连接)
3、缺乏错误处理和重试机制。
HttpClientApache HttpClient库1、提供了丰富的功能集。
2、支持HTTP协议的各种特性。
3、可以方便地管理连接池和请求超时
1、需要引入额外的依赖
2、相比其他轻量级库来说可能显得有些笨重。
OkHttp3OkHttp3库1、高性能,支持HTTP/2和其他现代特性。
2、易于使用,API设计友好。
3、提供了很好的错误处理和重试策略
1、需要引入外部依赖
2、对于只需要简单请求的应用来说,可能有些过于复杂。
RestTemplateSpring框架1、集成了Spring框架,便于集成使用
2、提供了方便的方法来发送各种类型的HTTP请求。
3、支持消息转换器,可以方便地处理请求和响应对象。
1、依赖于Spring框架
2、如果不在Spring环境中使用,可能显得冗余。
HutoolHutool库 (cn.hutool.http)1、API简单易用
2、提供了丰富的辅助方法。
3、轻量级,可以作为独立的库使用。
1、需要引入额外的依赖
2、相比于专门的HTTP客户端库,可能在某些高级功能上有所欠缺。

二、Demo接口地址

在开始介绍实现方式之前,推荐一个用于 HTTP/HTTPS 测试的网站,超级好用

  • HTTP 测试:http://httpbin.org/#/HTTP_Methods
  • HTTPS测试:https://httpbin.org/#/HTTP_Methods

这个网站提供了各种方式的接口测试,页面如下所示:

在这里插入图片描述

除了模拟基本的请求方式,这个网站还可以模拟以下各种类型的接口响应:

在这里插入图片描述


实现方式三、Okhttp3 库实现

3.1 简介

  • okhttp 是由 Square 公司开发的一款轻量级网络请求库,支持普通的 HTTP/1.1SPDY 网络协议,可与 Retrofit 等网络请求框架搭配使用。

3.2 Maven依赖

<!-- okhttp3 依赖 -->
<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.9.3</version>
</dependency>

3.3 配置文件

application.yml

ok:http:connect-timeout: 60read-timeout: 60write-timeout: 60# 连接池中整体的空闲连接的最大数量max-idle-connections: 200# 连接空闲时间最多为 300 秒keep-alive-duration: 300

3.4 配置类

需要给配置添加相应的配置类,来让配置生效。

OkHttpConfiguration.java

import okhttp3.ConnectionPool;
import okhttp3.OkHttpClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.concurrent.TimeUnit;/*** okhttp3配置类*/
@Configuration
public class OkHttpConfiguration {@Value("${ok.http.connect-timeout}")private Integer connectTimeout;@Value("${ok.http.read-timeout}")private Integer readTimeout;@Value("${ok.http.write-timeout}")private Integer writeTimeout;@Value("${ok.http.max-idle-connections}")private Integer maxIdleConnections;@Value("${ok.http.keep-alive-duration}")private Long keepAliveDuration;@Beanpublic OkHttpClient okHttpClient() {return new OkHttpClient.Builder().sslSocketFactory(sslSocketFactory(), x509TrustManager())// 是否开启缓存.retryOnConnectionFailure(false).connectionPool(pool()).connectTimeout(connectTimeout, TimeUnit.SECONDS).readTimeout(readTimeout, TimeUnit.SECONDS).writeTimeout(writeTimeout,TimeUnit.SECONDS).hostnameVerifier((hostname, session) -> true)// 设置代理// .proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 8888)))// 拦截器// .addInterceptor().build();}@Beanpublic X509TrustManager x509TrustManager() {return new X509TrustManager() {@Overridepublic void checkClientTrusted(X509Certificate[] chain, String authType)throws CertificateException {}@Overridepublic void checkServerTrusted(X509Certificate[] chain, String authType)throws CertificateException {}@Overridepublic X509Certificate[] getAcceptedIssuers() {return new X509Certificate[0];}};}@Beanpublic SSLSocketFactory sslSocketFactory() {try {// 信任任何链接SSLContext sslContext = SSLContext.getInstance("TLS");sslContext.init(null, new TrustManager[]{x509TrustManager()}, new SecureRandom());return sslContext.getSocketFactory();} catch (NoSuchAlgorithmException | KeyManagementException e) {e.printStackTrace();}return null;}@Beanpublic ConnectionPool pool() {return new ConnectionPool(maxIdleConnections, keepAliveDuration, TimeUnit.SECONDS);}
}

3.5 工具类

OkHttpClientUtil.java

package com.demo.util;import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import java.util.Map;/*** okhttp3工具类*/
@Slf4j
@Component
public class OkHttpClientUtil {private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");private static final MediaType XML = MediaType.parse("application/xml; charset=utf-8");private static OkHttpClient okHttpClient;// 为使用静态调用异步注入@Autowiredprivate OkHttpClient getOkHttpClient;@PostConstructpublic void init() {okHttpClient = getOkHttpClient;}/*** get 请求* @param url  请求url地址* @return string* */public static String doGet(String url) {return doGet(url, null, null);}public static byte[] doGetByte(String url) {return doGetByte(url, null, null);}public static String doPost(String url) {return doPost(url, null, null);}/*** get 请求* @param url  请求url地址* @param params 请求参数 map* @return string* */public static 

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【LLM论文日更】| 俄罗斯套娃嵌入模型

论文&#xff1a;https://proceedings.neurips.cc/paper_files/paper/2022/file/c32319f4868da7613d78af9993100e42-Paper-Conference.pdf代码&#xff1a;GitHub - RAIVNLab/MRL: Code repository for the paper - "Matryoshka Representation Learning"机构&#x…

线程池动态设置线程大小踩坑

在配置线程池核心线程数大小和最大线程数大小后&#xff0c;如果调用线程池setCorePoolSize方法来调整线程池中核心线程的大小&#xff0c;需要特别注意&#xff0c;可能踩坑&#xff0c;说不定增加了线程让你的程序性能更差。 ThreadPoolExecutor有提供一个动态变更线程池核心…

linux中vim编辑器的应用实例

前言 Linux有大量的配置文件&#xff0c;其中编辑一些配置文件&#xff0c;最常用的工具就是 Vim &#xff0c;本文介绍一个实际应用的Vim编辑器开发文档的实例。 Vim是一个类似于Vi的著名的功能强大、高度可定制的文本编辑器&#xff0c;在Vi的基础上改进和增加了很多特性。…

单片机原理及应用详解

目录 1. 什么是单片机&#xff1f; 2. 单片机的基本组成 3. 单片机的工作原理 4. 常见的单片机分类 5. 单片机的应用领域 6. 单片机开发流程 7. 单片机开发中的常见问题及解决方案 8. 单片机的未来发展趋势 9. 总结 1. 什么是单片机&#xff1f; 单片机&#xff08;Mi…

solidwork中圆角的快捷操作

第一步 第二步&#xff1a; 选择一条边 快捷选择多个边&#xff0c;就不用一个个去点

代码随想录算法day37 | 动态规划算法part10 | 300.最长递增子序列,674. 最长连续递增序列,718. 最长重复子数组

今天开始正式子序列系列&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 300.最长递增子序列 本题是比较简单的&#xff0c;感受感受一下子序列题目的思路。 力扣题目链接(opens new window) 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长…

视频怎么剪切掉一部分?6款视频剪切软件,零基础也能快速学会!

您是否也曾遇到了这样的一个问题&#xff1a;在录制完视频之后&#xff0c;发现视频中存在一些多余或者不想要的片段&#xff0c;想要将它剪切掉却不知道具体要怎么操作&#xff1f;别担心&#xff0c;几乎所有视频都会需要这样的调整才能更加出色。如果您是刚入门的视频剪辑初…

排序算法的分析和应用

自己设计一个长度不小于10的乱序数组&#xff0c;用希尔排序&#xff0c;自己设定希尔排序参数 画出每一轮希尔排序的状态 自己设计一个长度不小于10的乱序数组&#xff0c;用堆排序&#xff0c;最终要生成升序数组&#xff0c;画出建堆后的状态 画出每一轮堆排序的状态 自…

9.20日学习记录及相关问题解答

部分一 今天看了一本古老的书。学到了一些有关计算机的远古的知识。弥补了一些之前没有意识到的空白点。 原来上个世纪就有AI这个东西了 现阶段的主流模式&#xff0c;在许多年前其实是将来要发展的对象。 B/S指的是客户机/服务器结构模式 C/S是在B/S基础上发展过来的。三层结…

9月16日笔记

访问控制列表 访问控制列表(ACL)是访问控制项(Access Control Entry , ACE)的列表。安全对象的安全描述可以通过两种访问控制列表DACL和SACL进行。 DACL DACL 是由一条条的访问控制项(ACE)条目构成的&#xff0c;每条ACE定义了哪些用户或组对该对象拥有怎样的访问权限。DACL…

DeepCross模型实现推荐算法

1. 项目简介 A032-DeepCross项目是一个基于深度学习的推荐算法实现&#xff0c;旨在解决个性化推荐问题。随着互联网平台上信息和内容的爆炸式增长&#xff0c;用户面临着信息过载的困境&#xff0c;如何为用户提供高效、精准的推荐成为了关键。该项目背景基于现代推荐系统的发…

数仓规范:命名规范如何设计?

目录 0 前言 1 表命名规范 2 字段命名规范 3 任务命名规范 4 层级命名规范 5 自定义函数命名规范 6 视图和存储过程的命名规范 7 综合案例分析 8 常见陷阱和如何避免 9 工具和最佳实践 10 小结 想进一步了解数仓建设这门艺术的&#xff0c;可以订阅我的专栏数字化建设…

笔尖划出秋季的声息

笔尖划出秋季的声息 进入秋分&#xff0c;天气渐趋凉爽&#xff0c;天空青蓝明朗&#xff0c;难言伤感。 九月&#xff0c;把一些句子记录好&#xff0c;明年拿出来晒一晒&#xff0c;秋季也就有了答案。 1、经历 9月6日&#xff0c;台风“摩羯”席卷而过粤西&#xff0c;…

[Excel VBA]如何使用VBA按行拆分Excel工作表

如何使用VBA按行拆分Excel工作表 在Excel中&#xff0c;按行拆分工作表并生成多个新工作表是一项实用的技能&#xff0c;尤其在处理大量数据时。以下是一个VBA代码示例&#xff0c;能帮助你轻松实现这一功能。 1. 代码说明 本代码会根据源工作表中每个姓名创建一个新工作表&a…

mybatis 配置文件完成增删改查(二):根据条件查询一个

文章目录 参数占位符#{}:会将其替换为&#xff1f; ——为了防止sql注入${}:会将其替换为实际接收到的数据&#xff0c;拼sql ——无法防止sql注入 查询一个sql特殊字符的处理 参数占位符 #{}:会将其替换为&#xff1f; ——为了防止sql注入 ${}:会将其替换为实际接收到的数据…

2024年一区极光优化+分解+深度学习!VMD-PLO-Transformer-GRU多变量时间序列光伏功率预测

2024年一区极光优化分解深度学习&#xff01;VMD-PLO-Transformer-GRU多变量时间序列光伏功率预测 目录 2024年一区极光优化分解深度学习&#xff01;VMD-PLO-Transformer-GRU多变量时间序列光伏功率预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.中秋献礼&#…

python如何跨文件调用自己定义的函数

当自己定义函数过多时&#xff0c;只有一个python文件时代码会很长&#xff0c;不易理清代码框架&#xff0c;比如下面这段代码&#xff0c;如何隐藏具体函数细节呢&#xff1f;也就是把def函数放到另外一个python文件里步骤如下&#xff1a; 一个python文件代码篇幅过长 imp…

面试中如何回答关于 `RecyclerView` 性能优化的理解和实践经验

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 在面试中展示对 RecyclerView 性能优化的理解和实践经验&#xff0c;你可以从以下几个方面进行阐述&#xff1a; 1. 理解 RecyclerView 的工作…

Maven-五、属性

Maven 文章目录 Maven前言属性定义properties文件加载pom文件属性总结 前言 使用maven中的属性可以来简化我们的配置工作。 属性定义 在pom文件中可以使用**标签设置属性&#xff0c;属性名自定义,然后可以在使用${属性名}**文件中引用自己定义的属性。 使用属性进行配置&a…

干货 | 2024数智新时代制造业数字化创新实践白皮书(免费下载)

导读&#xff1a;本白皮书将对制造业发展历程、现状、趋势与核心难题做深入解读&#xff0c;并在此基础上提出了相应的制造行业解决方案,结合业内实践成功的客户案例来详析信息化转型的有效方法&#xff0c;以供生产制造行业的从业者参考交流。