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.rhkb.cn/news/430084.html

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

相关文章

Parallels Desktop 20 for Mac 推出:完美兼容 macOS Sequoia 与 Win11 24H2

Parallels Desktop 20 for Mac 近日正式发布&#xff0c;这一新版本不仅全面支持 macOS Sequoia 和 Windows 11 24H2&#xff0c;还在企业版中引入了一个全新的管理门户。新版本针对 Windows、macOS 和 Linux 虚拟机进行了多项改进&#xff0c;其中最引人注目的当属 Parallels …

导出导入Oracle数据库使用黑框命令方式exp、imp【亲测】

下载工具 根据自己数据库的版本下载&#xff0c;以v19为例&#xff1a; 下载基础包Basic Package和工具包Tools Package 两个压缩包中的文件夹一样&#xff0c;但内容不一样&#xff0c;将两个压缩包中的文件解压合并到一起 https://www.oracle.com/database/technologies/inst…

SpringCloud入门(六)Nacos注册中心(下)

一、Nacos环境隔离 Nacos提供了namespace来实现环境隔离功能。 nacos中可以有多个namespace。namespace下可以有group、service等。不同namespace之间相互隔离&#xff0c;例如不同namespace的服务互相不可见。 使用Nacos Namespace 环境隔离 步骤&#xff1a; 1.在Nacos控制…

时间序列无监督异常点检测算法_孤立森林,局部离群因子检测和自编码器

数据入口&#xff1a;压气机异常检测一维时间序列 - Heywhale.com 该数据为采样自工业压气机的一维时间序列数据。本文将通过无监督时间序列算法进行时间序列异常检测。针对时间序列数据&#xff0c;常用的无监督异常检测算法包括&#xff1a;孤立森林&#xff08;Isolation Fo…

【Yonghong星球】Windows平台上Yonghong的Python、DM-Engine安装与配置详细攻略

文章目录 问题描述问题解决(配置相应的python计算服务)拓展 第三方工具包安装/更新其他出现问题 问题描述 当我们进行深度分析的时候&#xff0c;运行结点报错&#xff0c;这是因为需要配置相应的python计算服务。 报错内容&#xff1a; 2024-09-20 13:57:22 开始运行“各省G…

js中的 赋值 浅拷贝 和 深拷贝 详细解读

js数据类型主要分基本数据类型和引用数据类型。前者包括Number,String等&#xff0c;后者主要是Object,因此以下会针对不同的数据类型来分析,需要的朋友可以参考一下 基本数据类型&#xff08;Primary Data Types&#xff09;: String&#xff08;字符串&#xff09; Number&…

三端全隔离485中继器光电隔离工业级 RS485集线器2口信号放大器 抗干扰防雷

485中继器光电隔离工业级 RS485集线器2口信号放大器 抗干扰防雷https://item.taobao.com/item.htm?ftt&id713033449656 哪里信号不好&#xff0c;中继器就接哪里 将有效的对信号进行隔离放大 信号隔离 电源隔离 双向传输 即插即用 增强抗干扰 延长通信距离 产品概…

防火墙详解(二)通过网页登录配置华为eNSP中USG6000V1防火墙

配置步骤 步骤一 打开eNSP&#xff0c;建立如下拓扑。防火墙使用&#xff1a;USG6000V1。 Cloud的作用是通过它可以连接本地的网卡&#xff0c;然后与我们的电脑进行通信。 由于防火墙USG6000V&#xff0c;不能直接开启&#xff0c;需要的导入包&#xff0c;所以需要在华为官网…

爬虫过程 | 蜘蛛程序爬取数据流程(初学者适用)

蜘蛛程序&#xff08;也称网络爬虫&#xff0c;是搜索引擎的重要组成部分&#xff09; 主要功能&#xff1a;遍历互联网&#xff0c;抓取网站信息并建立索引&#xff0c;便于用户在搜索引擎中检索到最新的网页内容工作原理&#xff1a;从初始网站页面的URL开始&#xff0c;发送…

【人工智能】看我如何用4个AI大模型,实现了堪比o1-preview的思维链。内含3个AI问答的数据比对结果!

在当今人工智能的快速发展中&#xff0c;如何高效地利用不同的AI模型来提升工作效率&#xff0c;成为了许多开发者和企业关注的焦点。本文将深入探讨如何通过4个GPT-4o模型与其他多模型的编排&#xff0c;构建一个强大的AI工作流&#xff0c;并与o1-preview的数据结果进行对比&…

怎么录屏?免费录屏软件推荐,电脑屏幕与摄像头内容录制与分享指南

在数字化办公和在线教育日益普及的今天&#xff0c;录屏软件成为了我们不可或缺的工具。无论是制作教学视频、游戏直播&#xff0c;还是远程会议记录&#xff0c;一个好的录屏软件都能让这些任务变得轻而易举。但面对市场上琳琅满目的录屏软件&#xff0c;我们该如何选择呢&…

国内短剧cps系统和短剧(播放)系统的区别,附各源码部署教程

国内短剧项目主要分为两大形式&#xff1a;一种是做短剧播放平台&#xff0c;让用户付费观看&#xff1b;另一种是做短剧的分销&#xff0c;就是将他人的平台短剧推广&#xff0c;可做平台可入驻&#xff0c;拿分成。 首先来说一下短剧播放平台&#xff08;短剧系统&#xff0…

【推荐100个unity插件之26】Unity 地形Terrain的绘制和使用进阶内容 —— Terrain Tools和 Terrain Toolbox的使用

文章目录 前言一、Terrain Toolbox的使用安装Terrain Tools下载导入资产样本打开选择Terrain Toolbox创建地形切割地形创建不同分组的地形terrain group设置第一个pixel error是LOD精度&#xff0c;值越小精度越高&#xff0c;当然性能开销也就越大第二个base map distance是指…

【网络安全】TCP和UDP

一、TCP/UDP对比 1.共同点&#xff1a; 都是工作在TCP/IP体系结构的传输层的协议 工作主要都是把端口号往原始数据封装 在 TCP 协议中&#xff0c;原始数据指的是应用程序产生的需要通过网络进行传输的数据。这些数据可以是各种类型的信息&#xff0c;例如文本、图像、音频、…

200Kg大载重多旋翼无人机应用前景详解

大载重多旋翼无人机是一类具备高载重能力和长航时特点的无人机系统&#xff0c;它们融合了多旋翼无人机的灵活性与大载重无人机的实用性&#xff0c;广泛应用于多个领域。 1. 航拍与影视制作 在航拍与影视制作领域&#xff0c;200Kg大载重多旋翼无人机凭借其出色的稳定性和载重…

mysql时间戳格式化yyyy-mm-dd

格式化到 年月日 # 将时间换成列名就行&#xff1b;当前是秒级时间戳&#xff0c;如果是毫秒的 / 1000即可 # SELECT FROM_UNIXTIME(1602668106666.777888999 / 1000,%Y-%m-%d) AS a; # SELECT FROM_UNIXTIME(列名 / 1000,%Y-%m-%d) AS a; SELECT FROM_UNIXTIME(1602668106.666…

动手学深度学习(四)卷积神经网络-下

全连接层存在的问题&#xff1a;参数过大&#xff0c;计算成本过高。 一、网络中的网络&#xff08;NiN&#xff09; 1、NiN块 ①NiN块的结构 NiN串联多个由卷积层和“全连接”层构成的小网络来构建一个深层网络。这种由卷积层和“全连接”层构成的小网络就是NiN块。 &#…

【学习笔记】 AD24中元器件重叠系统不报错的解决方案(消除报错)

【学习笔记】 AD24中PCB设计元器件重叠后系统不报错的解决方案&#xff08;如何主动屏蔽报错&#xff09; 一、Component Clearance未开启使能的解决方案二、最小水平间距设置错误的解决方案三、未开启设计规则检查的解决方案四、设计规则检查中 “在线”和“批量”的含义五、为…

Matplotlib绘制热力图

热力图&#xff08;Heatmap&#xff09;是一种使用颜色来表示数值强度的数据可视化工具。它常用于以下场景&#xff1a; 热力图的适用场景 数据的相关性分析&#xff1a;在统计学中&#xff0c;热力图常用于展示变量之间的相关性&#xff0c;尤其是当数据量较大时&#xff0c;…

Vue(14)——组合式API①

setup 特点&#xff1a;执行实际比beforeCreate还要早&#xff0c;并且获取不到this <script> export default{setup(){console.log(setup函数);},beforeCreate(){console.log(beforeCreate函数);} } </script> 在setup函数中提供的数据和方法&#xff0c;想要在…