Feign遠(yuǎn)程調(diào)用參數(shù)里面內(nèi)容丟失的解決方案
Feign遠(yuǎn)程調(diào)用參數(shù)里面內(nèi)容丟失
舉個(gè)例子
服務(wù)A提供了如下接口(注意這里的參數(shù)url是一個(gè)地址):
@GetMapping("/getSample")
public String getSample(@RequestParam String url){
?? ? //此處省略邏輯......
}服務(wù)B需要調(diào)用服務(wù)A的接口,調(diào)用如下:
sampleFeignClient.getSample("http://www.xxx.com?name=dumas&age=18");提出問(wèn)題:此時(shí)調(diào)用服務(wù)A接口后,在A服務(wù)接收的方法體內(nèi),斷點(diǎn)會(huì)發(fā)現(xiàn)后面的參數(shù)age=18會(huì)丟失。
問(wèn)題的原因:Feign遠(yuǎn)程調(diào)用是使用HTTP協(xié)議的,可能是獲取參數(shù)的時(shí)候,把參數(shù)url里面的內(nèi)容當(dāng)成了參數(shù),所以直接舍棄了。
解決方法
服務(wù)B調(diào)用前,使用URLEncoder.encode(url,"UTF-8");
服務(wù)A獲取參數(shù)后,使用URLDecoder.decode(url, "UTF-8");
Feign遠(yuǎn)程調(diào)用細(xì)節(jié)--丟失數(shù)據(jù)
同步調(diào)用
我這里只添加了header中的Cookie,當(dāng)然也可以遍歷header,把所有的都添加到新的請(qǐng)求,解決辦法跟Gateway丟失請(qǐng)求頭類似。
@Configuration
public class FeignConfiguration {
? ? //feign遠(yuǎn)程調(diào)用丟失請(qǐng)求頭問(wèn)題
? ? @Bean("requestInterceptor")
? ? public RequestInterceptor requestInterceptor(){
? ? ? ? return template -> {
? ? ? ? ? ? ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
? ? ? ? ? ? HttpServletRequest request = attributes.getRequest();
? ? ? ? ? ? String cookie = request.getHeader("Cookie");
? ? ? ? ? ? template.header("Cookie",cookie);
? ? ? ? };
? ? }
}異步調(diào)用
當(dāng)我們使用異步調(diào)用openfeign,上述代碼就會(huì)報(bào)空指針,獲取不到當(dāng)前的請(qǐng)求。
我們先獲取到當(dāng)前請(qǐng)求,再分享給子線程。
RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
? ? RequestContextHolder.setRequestAttributes(attributes);
? ? feign.doService();
}, executor);以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Feign遠(yuǎn)程調(diào)用傳遞對(duì)象參數(shù)并返回自定義分頁(yè)數(shù)據(jù)的過(guò)程解析
- feign遠(yuǎn)程調(diào)用無(wú)法傳遞對(duì)象屬性405的問(wèn)題
- Feign遠(yuǎn)程調(diào)用Multipartfile參數(shù)處理
- 使用Feign遠(yuǎn)程調(diào)用時(shí),序列化對(duì)象失敗的解決
- spring cloud feign實(shí)現(xiàn)遠(yuǎn)程調(diào)用服務(wù)傳輸文件的方法
- 解決在微服務(wù)環(huán)境下遠(yuǎn)程調(diào)用feign和異步線程存在請(qǐng)求數(shù)據(jù)丟失問(wèn)題
相關(guān)文章
解決SpringMvc中普通類注入Service為null的問(wèn)題
這篇文章主要介紹了解決SpringMvc中普通類注入Service為null的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Java實(shí)現(xiàn)刪除PDF中指定頁(yè)面
這篇文章主要為大家詳細(xì)介紹了如何使用一個(gè)免費(fèi)的國(guó)產(chǎn)Java庫(kù)來(lái)刪除PDF中的指定頁(yè)面或者刪除PDF中的空白頁(yè),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11
JAVA 實(shí)現(xiàn)延遲隊(duì)列的方法
這篇文章主要介紹了JAVA 實(shí)現(xiàn)延遲隊(duì)列的方法,文中講解非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下2020-06-06
淺析SpringBoot及環(huán)境搭建過(guò)程
Spring Boot是由Pivotal團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來(lái)簡(jiǎn)化新Spring應(yīng)用的初始搭建以及開(kāi)發(fā)過(guò)程.這篇文章主要介紹了SpringBoot介紹及環(huán)境搭建,需要的朋友可以參考下2018-01-01
java?cpu飆升問(wèn)題的詳細(xì)分析和處理方法
Java中CPU占用過(guò)高是一個(gè)常見(jiàn)的問(wèn)題,可能是由于線程過(guò)多、死循環(huán)、長(zhǎng)時(shí)間的阻塞、死鎖、GC頻繁等原因?qū)е碌?這篇文章主要介紹了java?cpu飆升問(wèn)題的詳細(xì)分析和處理方法,需要的朋友可以參考下2025-03-03

