请求三方http工具

请求三方接口工具封装
实现逻辑:

  1. 发起请求,输入基本请求信息:请求地址,请求类型,请求参数,是否需要认证
  2. 工具自动为需要添加认证的请求添加认证,如果发现token快要过期或返回的错误编码为定义的认证失败code,则自动重新获取token重新请求
package com.xxx;import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.Method;
import com.alibaba.fastjson.JSON;
import lombok.Data;import java.util.HashMap;
import java.util.Map;
import java.util.Objects;/*** GeneralRequest* 通用请求** @author cd* @date 2024/12/18 10:51*/
@Data
public class GeneralRequest {/*** 请求路径*/private String url;/*** 方法类型*/private Method method;/*** 请求头*/private Map<String, String> headers;/*** form表单类型参数*/private Map<String, Object> form;/*** 请求体body*/private String body;/*** 是否需要鉴权*/private Boolean needAuth;/*** http请求工具*/private HttpRequest httpRequest;public GeneralRequest(String url, Method method, Boolean needAuth) {this.url = url;this.method = method;this.form = new HashMap<>();this.headers = new HashMap<>();this.needAuth = Objects.equals(needAuth, true);this.httpRequest = HttpRequest.of(url).method(method);}public GeneralRequest body(String body) {this.body = body;this.httpRequest.body(body);return this;}public GeneralRequest form(Map<String, Object> form) {this.form = form;this.httpRequest.form(form);return this;}public GeneralRequest addHeader(String name, String value) {this.headers.put(name, value);this.httpRequest.header(name, value);return this;}public String getParameter() {if (StrUtil.isNotBlank(this.body)) {return this.body;}if (CollUtil.isNotEmpty(this.form)) {return JSON.toJSONString(this.form);}return "";}
}
package com.xxx;import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpStatus;
import cn.hutool.http.Method;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import lombok.extern.slf4j.Slf4j;import java.time.LocalDateTime;
import java.util.Map;/*** XxxHttpUtil** @author cd* @date 2024/12/18 13:46*/
@Slf4j
public class XxxHttpUtil {private TokenResponse cacheTokenResponse = null;/*** 获取token** @param refreshToken 刷新token* @return*/public TokenResponse getToken(boolean refreshToken) {TokenResponse tokenResponse = null;if (!refreshToken) {tokenResponse = this.cacheTokenResponse;}if (tokenResponse != null) {return tokenResponse;}//        模拟重新获取tokenBaseRes<TokenResponse> baseRes = executeFrom("http://localhost:8080/getToken", Method.GET, false, null, new TypeReference<>() {});tokenResponse = baseRes.getData();this.cacheTokenResponse = tokenResponse;return tokenResponse;}public String signRequest(GeneralRequest generalRequest, boolean refreshToken) {TokenResponse tokenResponse = null;if (generalRequest.getNeedAuth()) {tokenResponse = getToken(refreshToken);
//            判断token是否快过期if (LocalDateTime.now().plusSeconds(10).isAfter(tokenResponse.getExpiresTime())) {tokenResponse = getToken(true);}
//            添加认证请求头generalRequest.addHeader("Authorization", tokenResponse.getAccessToken());}HttpResponse httpResponse = generalRequest.getHttpRequest().execute();int httpResponseStatus = httpResponse.getStatus();boolean success = httpResponseStatus == HttpStatus.HTTP_OK;String result = null;if (success) {result = httpResponse.body();}log.info("接口调用记录,HttpStatusCode:{},请求是否成功:{},请求地址:{},参数:{},结果:{}",httpResponseStatus, success ? "成功" : "失败", generalRequest.getUrl(), generalRequest.getParameter(), result);return result;}public <R> R doAction(GeneralRequest generalRequest, TypeReference<R> type) {String result = signRequest(generalRequest, false);
//        按三方返回格式判断,一般返回有code、success、dataif (StrUtil.contains(result, "code")) {JSONObject jsonObject = JSON.parseObject(result);String code = jsonObject.getString("code");
//            200:成功if (StrUtil.equals(code, "200")) {return JSON.parseObject(result, type);}
//            200:鉴权失败
//            刷新token重试else if (StrUtil.equals(code, "500")) {result = signRequest(generalRequest, true);if (StrUtil.isNotBlank(result)) {return JSON.parseObject(result, type);}} else {return JSON.parseObject(result, type);}}return null;}public <R> R execute(String url, Method method, Boolean needAuth, String body, Map<String, Object> formParams, TypeReference<R> type) {GeneralRequest generalRequest = new GeneralRequest(url, method, needAuth);if (body != null) {generalRequest.body(body);}if (formParams != null) {generalRequest.form(formParams);}return doAction(generalRequest, type);}public <R> R executeJson(String url, Method method, String body, TypeReference<R> type) {return this.execute(url, method, true, body, null, type);}public <R> R executeJson(String url, Method method, Boolean needAuth, String body, TypeReference<R> type) {return this.execute(url, method, needAuth, body, null, type);}public <R> R executeFrom(String url, Method method, Boolean needAuth, Map<String, Object> formParams, TypeReference<R> type) {return this.execute(url, method, needAuth, null, formParams, type);}public <R> R executeFrom(String url, Method method, Map<String, Object> formParams, TypeReference<R> type) {return this.execute(url, method, true, null, formParams, type);}
}
package com.xxx;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.time.LocalDateTime;/*** TokenResponse** @author cd* @date 2024/12/18 13:50*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TokenResponse {/*** token*/private String accessToken;/*** 过期时间*/private LocalDateTime expiresTime;
}

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

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

相关文章

【附源码】Electron Windows桌面壁纸开发中的 CommonJS 和 ES Module 引入问题以及 Webpack 如何处理这种兼容

背景 在尝试让 ChatGPT 自动开发一个桌面壁纸更改的功能时&#xff0c;发现引入了一个 wallpaper 库&#xff0c;这个库的入口文件是 index.js&#xff0c;但是 package.json 文件下的 type:"module"&#xff0c;这样造成了无论你使用 import from 还是 require&…

WebGIS城市停水及影响范围可视化实践

目录 前言 一、相关信息介绍 1、停水信息的来源 2、停水包含的相关信息 二、功能简介 1、基础小区的整理 2、停水计划的管理 三、WebGIS空间可视化 1、使用到的组件 2、停水计划的展示 3、影响小区的展示 4、实际效果 四、总结 前言 城市停水&#xff0c;一个看似…

群落生态学研究进展】Hmsc包开展单物种和多物种分析的技术细节及Hmsc包的实际应用

联合物种分布模型&#xff08;Joint Species Distribution Modelling&#xff0c;JSDM&#xff09;在生态学领域&#xff0c;特别是群落生态学中发展最为迅速&#xff0c;它在分析和解读群落生态数据的革命性和独特视角使其受到广大国内外学者的关注。在学界不同研究团队研发出…

docker 部署 redis

docker 部署 redis 1. 下载 redis 镜像 # docker images | grep redis bitnami/redis 7.2.4-debian-11-r5 45de196aef7e 10 months ago 95.2MB2. docker-compose 部署 version: "3" services:redis:image: bitnami/redis:7.2.4-debian-11-…

Windows环境 (Ubuntu 24.04.1 LTS ) 国内镜像,用apt-get命令安装RabbitMQ,java代码样例

一、环境 Windows11 WSL(Ubuntu 24.04.1) 二、思路 1 用Windows中的Ubuntu安装RabbitMQ&#xff0c;贴近Linux的线上环境&#xff1b; 2 RabbitMQ用erlang语言编写的&#xff0c;先安装erlang的运行环境&#xff1b; 2 用Linux的apt-get命令安装&#xff0c;解决软件依赖…

Linux网络应用——高级IO

目录 1. I/O 的重新理解 2. 五种 I/O 模型 ① 阻塞 && 非阻塞 ② 同步 I/O && 异步 I/O 3. select 模型 ① 非阻塞 I/O ② select 接口介绍 ③ 代码实现 ④ select 模型的优缺点 4. poll 模型 ① poll 接口介绍 ② 代码实现 ③ 与 select 模型的…

Dcoker Redis哨兵模式集群介绍与搭建 故障转移 分布式 Java客户端连接

介绍 Redis 哨兵模式&#xff08;Sentinel&#xff09;是 Redis 集群的高可用解决方案&#xff0c;它主要用于监控 Redis 主从复制架构中的主节点和从节点的状态&#xff0c;并提供故障转移和通知功能。通过 Redis 哨兵模式&#xff0c;可以保证 Redis 服务的高可用性和自动故…

使用 Wireshark 和 Lua 脚本解析通讯报文

在复杂的网络环境中&#xff0c;Wireshark 凭借其强大的捕获和显示功能&#xff0c;成为协议分析不可或缺的工具。然而&#xff0c;面对众多未被内置支持的协议或需要扩展解析的场景&#xff0c;Lua 脚本的引入为Wireshark 提供了极大的灵活性和可扩展性。本文将详细介绍如何使…

宝塔SSL证书申请失败,报错:申请SSL证书错误 module ‘OpenSSL.crypto‘ has no attribute ‘sign‘(已解决)

刚安装宝塔申请SSL就报错&#xff1a;申请SSL证书错误 module OpenSSL.crypto has no attribute sign 面板、插件版本&#xff1a;9.2.0 系统版本&#xff1a;Alibaba Cloud Linux 3.2104 LTS 问题&#xff1a;申请SSL证书错误 module OpenSSL.crypto has no attribute sign…

自动驾驶控制与规划——Project 2: 车辆横向控制

目录 零、任务介绍一、环境配置二、算法三、代码实现四、效果展示 零、任务介绍 补全src/ros-bridge/carla_shenlan_projects/carla_shenlan_stanley_pid_controller/src/stanley_controller.cpp中的TODO部分。 一、环境配置 上一次作业中没有配置docker使用gpu&#xff0c;…

双内核架构 Xenomai 4 安装教程

Xenomai 4是一种双内核架构, 继承了Xenomai系列的特点&#xff0c;通过在Linux内核中嵌入一个辅助核心&#xff08;companion core&#xff09;&#xff0c;来提供实时能力。这个辅助核心专门处理那些需要极低且有界响应时间的任务。 本文将在官网教程(https://evlproject.org/…

MySQL学习之DML操作

目录 插入 删除 修改 数据库事务 事务的特征&#xff08;ACID原则&#xff09; 原子性 一致性 隔离性 持久性 事务隔离级别 读未提交 读已提交 可重复读 序列化 脏读 虚读 幻读 插入 insert into 表名 values(); 要求插入数据的数量&#xff0c;类型要和定义…

clearvoice 语音降噪、语音分离库

参看: https://github.com/modelscope/ClearerVoice-Studio/tree/main ClearVoice 提供了一个统一的推理平台,用于语音增强、语音分离以及视听目标说话人提取。 代码参看: https://github.com/modelscope/ClearerVoice-Studio/tree/main/clearvoice https://github.com/mode…

linux打包qt程序

Linux下Qt程序打包_linuxdeployqt下载-CSDN博客 Linux/Ubuntu arm64下使用linuxdeployqt打包Qt程序_linuxdeployqt arm-CSDN博客 本篇文章的系统环境是 : 虚拟机ubuntu18.04 用下面这个qmake路径 进行编译 在 ~/.bashrc 文件末尾&#xff0c;qmake目录配置到文件末尾 将上图中…

qt-C++笔记之自定义类继承自 `QObject` 与 `QWidget` 及开发方式详解

qt-C笔记之自定义类继承自 QObject 与 QWidget 及开发方式详解 code review! 参考笔记 1.qt-C笔记之父类窗口、父类控件、对象树的关系 2.qt-C笔记之继承自 QWidget和继承自QObject 并通过 getWidget() 显示窗口或控件时的区别和原理 3.qt-C笔记之自定义类继承自 QObject 与 QW…

教师工作量管理系统

源代码地址&#xff1a;31、教师工作量管理系统 目录 1系统概述 1.1 研究背景 1.2研究目的 1.3系统设计思想 2相关技术 2.1 MYSQL数据库 2.2 B/S结构 2.3 Spring Boot框架简介 3系统分析 3.1可行性分析 3.1.1技术可行性 3.1.2经济可行性 3.1.3操作可行性 3.2系统性…

LiveData源码研究

LiveData 源码分析 前言 用过MVVM的大概知道LiveData可以感知组件的生命周期&#xff0c;当页面活跃时&#xff0c;更新页面数据&#xff0c; 当页面处于非活跃状态&#xff0c;它又会暂停更新&#xff0c;还能自动注册和注销观测者&#xff0c;能有效避免内存泄漏和不必要的…

vscode+msys2+clang+xmake c++开发环境搭建

转载请标明出处&#xff1a;小帆的帆的专栏 安装msys2 下载msys2安装包&#xff1a;清华源下载地址安装msys2&#xff1a;安装目录&#xff0c;C:\Softwares\msys64 安装cling工具链&#xff0c;xmake &#xff01;&#xff01;&#xff01;在开始菜单中启动MSYS2 CLANG64,…

VMware ubuntu16.04怎么设置静态IP联网

1.将VMware桥接到当前电脑使用的网络上面&#xff1b; 2.点击网络符号&#xff0c;编辑连接&#xff1b; 3.双击有线连接1&#xff1b; 4.选择IPv4设置&#xff0c;将地址&#xff0c;子网掩码&#xff0c;网关&#xff0c;DNS服务器设置好&#xff0c;保存&#xff1b; 5.在终…

金蝶云苍穹踩过的坑(慢慢更新)

IDEA不能用最新版&#xff0c;不然搜不到金蝶的插件。 我用的是2024.1.7/2023.1.7 IDEA里增加金蝶插件库的地址也变了&#xff0c;现在是 https://tool.kingdee.com/kddt/idea-updatePlugins.xml 金蝶云苍穹部署在服务器 MAC本地IDEA调试的时候&#xff0c;登录N次能成功一次…