欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring Cloud Feign請求添加headers的實現(xiàn)方式

 更新時間:2023年04月26日 17:05:26   作者:clonechen2021  
這篇文章主要介紹了Spring Cloud Feign請求添加headers的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

背景

部門技術(shù)升級,HttpClient需要升級Feign調(diào)用,重構(gòu)某一個資方時遇到請求需要添加上自定義簽名headers,踩坑后記錄了下來

方案一

方法上的@RequestMapping注解添加headers信息

@RequestMapping注解的屬性中包含一個headers數(shù)組,所以嘗試使用,在指定的方法上@RequestMapping注解中添加需要的headers,可以是寫死的,也可以讀取配置,測試是有效的

同理@RequestMapping一組的@PostMapping,@GetMapping注解等均適用

@FeignClient(name = "server",url = "127.0.0.1:8080")
public interface FeignTest {
? ? @RequestMapping(value = "/test",headers = {"app=test-app","token=${test-app.token}"})
? ? String test();
}

方案二

接口上的@RequestMapping注解添加headers信息

針對單個方法可以在方法上的@RequestMapping注解中添加headers,如果同一個接口中所有的方法都需要同樣的headers時在方法上加就比較繁瑣了,可以在接口上的@RequestMapping注解中添加headers,使整個接口的方法均被添加同樣的headers

@FeignClient(name = "server",url = "127.0.0.1:8080")
@RequestMapping(value = "/",headers = {"app=test-app","token=${test-app.token}"})
public interface FeignTest {
? ? @RequestMapping(value = "/test")
? ? String test();
}

方案三

使用@Headers注解添加headers信息

@FeignClient(name = "server",url = "127.0.0.1:8080")
@Headers({"app: test-app","token: ${test-app.token}"})
public interface FeignTest {
? ? @RequestMapping(value = "/test")
? ? String test();
}

查看openfeign官方文檔發(fā)現(xiàn)其使用的是@Headers來添加headers,測試發(fā)現(xiàn)并沒有生效,spring cloud使用了自己的SpringMvcContract來解析注解,所以需要自己實現(xiàn)一個Contract來實現(xiàn)對@Headers注解的支持,具體實現(xiàn)參照http://www.dbjr.com.cn/article/282530.htm

方案四

自定義RequestInterceptor添加headers信息

feign提供了一個攔截器接口RequestInterceptor,實現(xiàn)RequestInterceptor接口就可以實現(xiàn)對feign請求的攔截,接口提供了一個方法apply(),實現(xiàn)apply()方法

@Component
public class FeignRequestInterceptor implements RequestInterceptor {

? ? @Value("${test-app.token}")
? ? private String token;
? ??
? ? @Override
? ? public void apply(RequestTemplate requestTemplate) {
? ? ? ? requestTemplate.header("app","test-app");//靜態(tài)
? ? ? ? requestTemplate.header("token",token);//讀配置
? ? }
}

實現(xiàn)apply()方法直接添加header會攔截所有的請求都加上headers,如果不是所有的feign請求都需要用到不建議此方法

方案五

自定義RequestInterceptor實現(xiàn)添加動態(tài)數(shù)據(jù)到header

以上方案都不適合把動態(tài)的數(shù)據(jù)放入headers中,而通常場景下可能經(jīng)常需要把計算的簽名,用戶id等動態(tài)信息設(shè)置到headers,所以還需要一個更加完善的方案。

方案1/2/3均不能設(shè)置動態(tài)的值,方案4可以設(shè)置動態(tài)值,但是沒做到請求的區(qū)分,所以在方案4的基礎(chǔ)上進行改進得到了較為完善的方案5。

具體實現(xiàn)如下:

在請求調(diào)用代碼中,獲取到HttpServletRequest對象,將需要添加到headers中的值封裝成一個map后放入HttpServletRequest的attribute域中

ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = Objects.requireNonNull(attributes).getRequest();
String signedMsg = getSignedMsg(reqJson); // 計算簽名字符串
Map<String, String> reqMap = new HashMap<>();
reqMap.put("content-type", "application/json");//常量字段
reqMap.put("accessKey", accessKey);//常量字段
reqMap.put("signedMsg", signedMsg);//動態(tài)計算/獲取字段
request.setAttribute("customizedRequestHeader", reqMap);

在自定義RequestInterceptor中獲取到HttpServletRequest對象的attribute域中指定的key,將key對應(yīng)map中的所有參數(shù)加入到headers。

@Component
public class FeignRequestInterceptor implements RequestInterceptor {

? ? @Override
? ? public void apply(RequestTemplate requestTemplate) {
? ? ? ? ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
? ? ? ? HttpServletRequest request = attributes.getRequest();

? ? ? ? // 設(shè)置自定義header
? ? ? ? // 設(shè)置request中的attribute到header以便轉(zhuǎn)發(fā)到Feign調(diào)用的服務(wù)
? ? ? ? Enumeration<String> reqAttrbuteNames = request.getAttributeNames();
? ? ? ? if (reqAttrbuteNames != null) {
? ? ? ? ? ? while (reqAttrbuteNames.hasMoreElements()) {
? ? ? ? ? ? ? ? String attrName = reqAttrbuteNames.nextElement();
? ? ? ? ? ? ? ? if (!"customizedRequestHeader".equalsIgnoreCase(attrName)) {
? ? ? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? Map<String,String> requestHeaderMap = (Map)request.getAttribute(attrName);
? ? ? ? ? ? ? ? for (Map.Entry<String, String> entry : requestHeaderMap.entrySet()) {
? ? ? ? ? ? ? ? ? ? requestTemplate.header(entry.getKey(), entry.getValue());
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ? }
}

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • JVM類加載之雙親委派機制解讀

    JVM類加載之雙親委派機制解讀

    這篇文章主要介紹了JVM類加載之雙親委派機制解讀,類加載階段分為加載、連接、初始化三個階段,而加載階段需要通過類的全限定名來獲取定義了此類的二進制字節(jié)流,Java特意把這一步抽出來用類加載器來實現(xiàn),需要的朋友可以參考下
    2023-12-12
  • java工具類實現(xiàn)文件壓縮zip以及解壓縮功能

    java工具類實現(xiàn)文件壓縮zip以及解壓縮功能

    這篇文章主要給大家介紹了關(guān)于java工具類實現(xiàn)文件壓縮zip以及解壓縮功能的相關(guān)資料,文中主要使用使用的是hutool工具類,Hutool是一個Java工具類庫,由國內(nèi)的程序員loolly開發(fā),目的是提供一些方便、快捷、實用的工具類和工具方法,需要的朋友可以參考下
    2024-02-02
  • Java動態(tài)規(guī)劃之硬幣找零問題實現(xiàn)代碼

    Java動態(tài)規(guī)劃之硬幣找零問題實現(xiàn)代碼

    這篇文章主要介紹了Java動態(tài)規(guī)劃之硬幣找零問題實現(xiàn)代碼,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Java使用Sharding-JDBC分庫分表進行操作

    Java使用Sharding-JDBC分庫分表進行操作

    Sharding-JDBC 是無侵入式的 MySQL 分庫分表操作工具,本文主要介紹了Java使用Sharding-JDBC分庫分表進行操作,感興趣的可以了解一下
    2021-08-08
  • 避免sql注入_動力節(jié)點Java學(xué)院整理

    避免sql注入_動力節(jié)點Java學(xué)院整理

    這篇文章主要介紹了避免sql注入,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • MyBatis延遲加載與立即加載案例教程

    MyBatis延遲加載與立即加載案例教程

    這篇文章主要介紹了MyBatis延遲加載與立即加載案例教程,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Java多線程——基礎(chǔ)概念

    Java多線程——基礎(chǔ)概念

    這篇文章主要介紹了java多線程編程實例,分享了幾則多線程的實例代碼,具有一定參考價值,加深多線程編程的理解還是很有幫助的,需要的朋友可以參考下,希望可以幫到你
    2021-07-07
  • Java中字符序列的替換與分解的幾種實現(xiàn)方法

    Java中字符序列的替換與分解的幾種實現(xiàn)方法

    本文主要介紹了Java中字符序列的替換與分解的幾種實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Java創(chuàng)建子線程的兩種方法

    Java創(chuàng)建子線程的兩種方法

    這篇文章主要介紹了Java創(chuàng)建子線程的兩種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • JAVAWEB實現(xiàn)簡單的商城項目(一)實例代碼解析

    JAVAWEB實現(xiàn)簡單的商城項目(一)實例代碼解析

    本文給大家分享一段實例代碼給大家介紹JAVAWEB實現(xiàn)簡單的商城項目(一),非常具有參考價值,感興趣的朋友一起學(xué)習(xí)吧
    2016-02-02

最新評論