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

news2024/9/23 6:21:09

目录

    • 一、五种实现方式对比结果
    • 二、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

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

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

实现方式 底层依赖 优点 缺点
HttpURLConnection Java标准库 (java.net) 1、不需要外部依赖
2、能够直接访问java.net.URL类的功能。
1、功能相对有限。
2、需要手动管理很多资源(如打开和关闭连接)
3、缺乏错误处理和重试机制。
HttpClient Apache HttpClient库 1、提供了丰富的功能集。
2、支持HTTP协议的各种特性。
3、可以方便地管理连接池和请求超时
1、需要引入额外的依赖
2、相比其他轻量级库来说可能显得有些笨重。
OkHttp3 OkHttp3库 1、高性能,支持HTTP/2和其他现代特性。
2、易于使用,API设计友好。
3、提供了很好的错误处理和重试策略
1、需要引入外部依赖
2、对于只需要简单请求的应用来说,可能有些过于复杂。
RestTemplate Spring框架 1、集成了Spring框架,便于集成使用
2、提供了方便的方法来发送各种类型的HTTP请求。
3、支持消息转换器,可以方便地处理请求和响应对象。
1、依赖于Spring框架
2、如果不在Spring环境中使用,可能显得冗余。
Hutool Hutool库 (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: 60
    read-timeout: 60
    write-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;
    @Bean
    public 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();
    }
    @Bean
    public X509TrustManager x509TrustManager() {
   
        return new X509TrustManager() {
   
            @Override
            public void checkClientTrusted(X509Certificate[] chain, String authType)
                    throws CertificateException {
   
            }
            @Override
            public void checkServerTrusted(X509Certificate[] chain, String authType)
                    throws CertificateException {
   
            }
            @Override
            public X509Certificate[] getAcceptedIssuers() {
   
                return new X509Certificate[0];
            }
        };
    }
    @Bean
    public 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;
    }
    @Bean
    public 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;

    // 为使用静态调用异步注入
    @Autowired
    private OkHttpClient getOkHttpClient;
    @PostConstruct
    public 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.coloradmin.cn/o/2156852.html

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

相关文章

华为HarmonyOS灵活高效的消息推送服务(Push Kit) - 5 发送通知消息

场景介绍 通知消息通过Push Kit通道直接下发&#xff0c;可在终端设备的通知中心、锁屏、横幅等展示&#xff0c;用户点击后拉起应用。您可以通过设置通知消息样式来吸引用户。 开通权益 Push Kit根据消息内容&#xff0c;将通知消息分类为服务与通讯、资讯营销两大类别&…

idea2021git从dev分支合并到主分支master

1、新建分支 新建一个名称为dev的分支&#xff0c;切换到该分支下面&#xff0c;输入新内容 提交代码到dev分支的仓库 2、切换分支 切换到主分支&#xff0c;因为刚刚提交的分支在dev环境&#xff0c;所以master是没有 3、合并分支 点击push&#xff0c;将dev里面的代码合并到…

Spring AI Alibaba,阿里的AI Java 开发框架

源码地址 https://github.com/alibaba/spring-ai-alibaba

资源创建方式-Job

Job: 容器按照持续运行的时间可分为两类&#xff0c;服务类容器&#xff0c;和工作类容器 服务类容器通常持续提供服务&#xff0c;需要一直运行&#xff0c;比如HTTP,Server&#xff0c;Daemon等&#xff0c; 工作类容器则是一次性任务&#xff0c;比如批处理程序&#xff0…

跟着问题学12——GRU详解

1 GRU 1. 什么是GRU GRU&#xff08;Gate Recurrent Unit&#xff09;是循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;的一种。和LSTM&#xff08;Long-Short Term Memory&#xff09;一样&#xff0c;也是为了解决长期记忆 和反向传播中的梯度等问题…

数据集-目标检测系列-吸烟检测数据集 smoking cigarette >> DataBall

数据集-目标检测系列-吸烟检测数据集 smoking cigarette >> DataBall 数据集-目标检测系列-吸烟检测数据集 &#xff08;smoking cigarette&#xff09; 数据量&#xff1a;1W 想要进一步了解&#xff0c;请联系 DataBall。 DataBall 助力快速掌握数据集的信息和使用方…

闯关leetcode——67. Add Binary

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/add-binary/description/ 内容 Given two binary strings a and b, return their sum as a binary string. Example 1: Input: a “11”, b “1” Output: “100” Example 2: Input: a “101…

Qt系统相关——事件

文章目录 事件和信号槽的关系事件处理鼠标事件鼠标进入和离开鼠标点击获取位置鼠标释放鼠标双击鼠标移动鼠标滚轮 键盘事件定时器事件窗口移动和窗口改变 事件和信号槽的关系 Qt信号槽机制&#xff1a; 用户进行的操作就可能产生信号&#xff0c;可以给某个信号指定槽函数&…

Effective Java 学习笔记 如何为方法编写文档

目录 方法的文档注解设计的原则 Javadoc常用的文档注释 一些注意细节 通过Javadoc命令生成h5页面 这是第8章Java方法的最后一部分&#xff0c;聚焦为导出的API编写文档注释。 如果要想使得API真正可用&#xff0c;配套的文档是必须的。Java提供了Javadoc这个文档生成工具&…

Renesas R7FA8D1BH (Cortex®-M85)的 General PWM的应用实践

目录 概述 1 General PWM介绍 1.1 特性 1.2 定时器选择注意点 2 时钟配置 3 应用案例 3.1 基本定时器应用 3.2 定时器回调函数案例 3.3 输入捕捉功能案例 3.4 更新周期案例 3.5 更新占空比案例 3.6 单次触发脉冲案例 4 测试 4.1 代码介绍 4.2 验证 概述 本文主…

基于SpringBoot+Vue+MySQL的特色旅游网站系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着旅游业的蓬勃发展&#xff0c;人们对旅游体验的需求日益多样化与个性化。传统的旅游信息查询与预订方式已难以满足现代游客的需求。因此&#xff0c;我们开发了这款基于SpringBootVueMySQL的特色旅游网站系统。该系统旨在通…

HTML实现的简单网站首页模板

这个是简单的网站首页模板&#xff0c;用于学习或者参考 实现代码: <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&…

移动硬盘‘需格式化‘困境:原因剖析、恢复策略与预防之道

困境直击&#xff1a;移动硬盘为何需格式化才能访问&#xff1f; 在数字化时代&#xff0c;移动硬盘作为数据存储与传输的重要工具&#xff0c;其稳定性与可靠性直接关系到用户数据的安全。然而&#xff0c;不少用户在使用过程中遭遇了“移动硬盘需要格式化才能打开”的尴尬境…

Qt_对话框QDialog的介绍

目录 1、新建项目对话框 2、非模态对话框 3、模态对话框 4、自定义对话框 5、Qt内置对话框 5.1 消息对话框QMessageBox 5.2 颜色对话框QColorDialog 5.3 文件对话框QFileDialog 5.4 字体对话框QFontDialog 5.5 输入对话框QInputDialog 结语 前言: 在Qt中&…

布草洗涤必备4张表-———未来之窗行业应用跨平台架构

一、洗涤厂客户月度报表 二、大酒店楼层布草月度统计报表 三、职员月度报表 四、司机当日统计报表 五、阿雪技术观 拥抱开源与共享&#xff0c;见证科技进步奇迹&#xff0c;畅享人类幸福时光&#xff01; 让我们积极投身于技术共享的浪潮中&#xff0c;不仅仅是作为受益者&a…

【软件测试】Bug 篇

哈喽&#xff0c;哈喽&#xff0c;大家好~ 我是你们的老朋友&#xff1a;保护小周ღ 今天给大家带来的是 【软件测试】Bug 篇&#xff0c;首先了解, 什么是Bug, 如何定义一个Bug, 如何描述一个 Bug, Bug的级别, 和 Bug 的生命周期, 以及测试人员跟开发人员产生争执如何处理,…

最佳植树距离 - 华为OD统一考试(E卷)

2024华为OD机试&#xff08;C卷D卷E卷&#xff09;最新题库【超值优惠】Java/Python/C合集 题目描述 按照环保公司要求&#xff0c;小明需要在沙化严重的地区进行植树防沙工作&#xff0c;初步目标是种植一条直线的树带。由于有些区域目前不适合种植树木&#xff0c;所以只能在…

橙子质量检测系统源码分享

橙子质量检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

【报告阅读】chatgpt-o1 技术报告阅读 | 新的迭代开始了~

OpenAI o1是通过强化学习去进行复杂推理&#xff0c;在它回答之前&#xff0c;他会经过复杂的内部思维链的思考。 经过强化训练的o1多强 1 表现 在美国数学奥林匹克预选赛中名列前500名的学生中&#xff0c;o1排89名 在物理、生物、化学问题的基准测试中超过人类博士水平 其…

stm32单片机个人学习笔记7(TIM定时中断)

前言 本篇文章属于stm32单片机&#xff08;以下简称单片机&#xff09;的学习笔记&#xff0c;来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记&#xff0c;只能做参考&#xff0c;细节方面建议观看视频&#xff0c;肯定受益匪浅。 STM32入门教程-2023版 细…