请求三方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.mzph.cn/web/63307.shtml

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

相关文章

HP服务器开启性能模式

ENERGY PERF BIAS CFG 模式指的是通过特定配置(通常是 BIOS 或操作系统中的设置)来控制处理器的能源性能偏置(Energy Performance Bias, EPB)。EPB 是一种机制,允许用户或系统管理员在性能和功耗之间进行权衡。不同的设置可以影响系统的响应速度、能效等。 ENERGY PERF B…

调用钉钉接口发送消息

调用钉钉接口发送消息 通过创建钉钉开放平台创建H5小程序&#xff0c;通过该小程序可以实现向企业内的钉钉用户发送消息&#xff08;消息是以工作通知的形式发送&#xff09; 1、目前仅支持发送文本消息&#xff0c;相同内容的文本只能成功发送一次&#xff0c;但是接口返回发…

纯css 实现呼吸灯效果

开始效果 呼吸效果 实现代码 <div class"container"><div class"breathing-light"></div> </div><style>html,body {height: 100%;background-color: white;}.container {padding: 100px;}.container .breathing-light {wi…

进程通信方式---共享映射区(无血缘关系用的)

5.共享映射区&#xff08;无血缘关系用的&#xff09; 文章目录 5.共享映射区&#xff08;无血缘关系用的&#xff09;1.概述2.mmap&&munmap函数3.mmap注意事项4.mmap实现进程通信父子进程练习 无血缘关系 5.mmap匿名映射区 1.概述 原理&#xff1a;共享映射区是将文件…

《云原生安全攻防》-- K8s安全框架:认证、鉴权与准入控制

从本节课程开始&#xff0c;我们将来介绍K8s安全框架&#xff0c;这是保障K8s集群安全比较关键的安全机制。接下来&#xff0c;让我们一起来探索K8s安全框架的运行机制。 在这个课程中&#xff0c;我们将学习以下内容&#xff1a; K8s安全框架&#xff1a;由认证、鉴权和准入控…

day08-别名-重定向-去重排序等

1.重复用touch命令创建同一份文件&#xff0c;会修改文件的时间戳。 alias命令&#xff1a; 别名 查看已有别名&#xff1a;alias [rootoldboy ~]# alias alias cpcp -i alias egrepegrep --colorauto alias fgrepfgrep --colorauto alias grepgrep --colorauto alias l.ls…

Qt WORD/PDF(四)使用 QAxObject 对 Word 替换(QWidget)

关于QT Widget 其它文章请点击这里: QT Widget 国际站点 GitHub: https://github.com/chenchuhan 国内站点 Gitee : https://gitee.com/chuck_chee 姊妹篇: Qt WORD/PDF&#xff08;一&#xff09;使用 QtPdfium库实现 PDF 操作 Qt WORD/PDF&#xff08;二…

设计一个基础JWT的多开发语言分布式电商系统

在设计一个分布式电商系统时&#xff0c;保证系统的可扩展性、性能以及跨语言的兼容性是至关重要的。随着微服务架构的流行&#xff0c;越来越多的电商系统需要在多个服务间共享信息&#xff0c;并且保证服务的安全性。在这样的场景下&#xff0c;JSON Web Token&#xff08;JW…

实践分享 | 公共数据金融应用的理论探索与实践研究—以人民币银行结算账户数据应用为例

摘要:公共数据具有高权威性、高准确性、高价值性以及高应用性的特点,实现公共数据的金融应用对更好服务实体经济、防控金融风险和提升金融服务水平具有重要现实意义。本文从理论探索与实践研究两个层面分析了公共数据金融应用的具体问题,一方面探索性的给出了公共数据金融应…

Node的学习以及学习通过Node书写接口并简单操作数据库

Node的学习 Node的基础上述是关于Node的一些基础&#xff0c;总结的还行&#xff1b; 利用Node书写接口并操作数据库 1. 初始化项目 创建新的项目文件夹&#xff0c;并初始化 package.json mkdir my-backend cd my-backend npm init -y2. 安装必要的依赖 安装Express.js&…

计算机视觉中的特征提取算法

摘要&#xff1a; 本文聚焦于计算机视觉中的特征提取算法&#xff0c;深入探讨尺度不变特征变换&#xff08;SIFT&#xff09;算法。详细阐述 SIFT 算法的原理&#xff0c;包括尺度空间构建、关键点检测、方向分配与特征描述子生成等核心步骤。通过 C#、Python 和 C 三种编程语…

MySQL 主从复制与 Binlog 深度解析

目录 1. Binlog的工作原理与配置2. 主从复制的设置与故障排除3. 数据一致性与同步延迟的处理 小结 MySQL的binlog&#xff08;二进制日志&#xff09;和主从复制是实现数据备份、容灾、负载均衡以及数据同步的重要机制。在高可用性架构和分布式数据库设计中&#xff0c;binlog同…

排队论、负载均衡和任务调度关系

目录 排队论、负载均衡和任务调度关系 一、排队论 二、负载均衡 三、任务调度 四、总结 排队论、负载均衡和任务调度关系 排队论为负载均衡和任务调度提供了数学理论和方法支持 排队论、负载均衡和任务调度是三个相关但不同的概念。以下是对这三个概念的详细解释和它们之…

java版询价采购系统 招投标询价竞标投标系统 招投标公告系统源码

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…

景联文科技入选中国信通院发布的“人工智能数据标注产业图谱”

近日&#xff0c;由中国信息通信研究院、中国人工智能产业发展联盟牵头&#xff0c;联合中国电信集团、沈阳市数据局、保定高新区等70多家单位编制完成并发布《人工智能数据标注产业图谱》。景联文科技作为人工智能产业关键环节的代表企业&#xff0c;入选图谱中技术服务板块。…

【小沐学GIS】基于C++绘制三维数字地球Earth(OpenGL、glfw、glut、QT)第三期

&#x1f37a;三维数字地球系列相关文章如下&#x1f37a;&#xff1a;1【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;456:OpenGL、glfw、glut&#xff09;第一期2【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;456:OpenGL、glfw、glut&#xff09;第二期3【小沐…

实景视频与模型叠加融合?

[视频GIS系列]无人机视频与与实景模型进行实时融合_无人机视频融合-CSDN博客文章浏览阅读1.5k次&#xff0c;点赞28次&#xff0c;收藏14次。将无人机视频与实景模型进行实时融合是一个涉及多个技术领域的复杂过程&#xff0c;主要包括无人机视频采集、实景模型构建、视频与模型…

MySQL通过binlog日志进行数据恢复

记录一次阿里云MySQL通过binlog日志进行数据回滚 问题描述由于阿里云远程mysql没有做安全策略 所以服务器被别人远程攻击把数据库给删除&#xff0c;通过查看binlog日志可以看到进行了drop操作&#xff0c;下面将演示通过binlog日志进行数据回滚操作。 1、查询是否开始binlog …

IDEA 修改格式化仅格式化本次改动代码

最近总是发现格式化的时候会格式化文件所有代码&#xff0c;提交Git 后再看提交日志&#xff0c;就很不清晰。修改方式如下 中文&#xff1a; 格式化代码快捷键[中文配置]&#xff1a; 英文&#xff1a; 格式化代码快捷键[英文配置]&#xff1a;

el-table ToggleRowSelection实现取消选中没效果(virtual-scroll)

场景&#xff1a; 就是在虚拟列表el-table选中之后 点击查询 默认之前选中的 现象&#xff1a; 就是实现选中&#xff0c; 但是无法去除勾选等等 问题发现&#xff1a; 看定位的数据 有多个一样的&#xff0c;我想着勾选之前 先去掉勾选 &#xff0c;但是没效果或者说“相同的…