請求三方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.pswp.cn/web/63307.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63307.shtml
英文地址,請注明出處:http://en.pswp.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;但是沒效果或者說“相同的…