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");
提出問題:此時(shí)調(diào)用服務(wù)A接口后,在A服務(wù)接收的方法體內(nèi),斷點(diǎn)會(huì)發(fā)現(xiàn)后面的參數(shù)age=18會(huì)丟失。
問題的原因: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)求頭問題 ? ? @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ù)的過程解析
- feign遠(yuǎn)程調(diào)用無(wú)法傳遞對(duì)象屬性405的問題
- 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ù)丟失問題
相關(guān)文章
合并有序數(shù)組的實(shí)現(xiàn)(java與C語(yǔ)言)
這篇文章主要介紹了合并有序數(shù)組的實(shí)現(xiàn)(java與C語(yǔ)言)的相關(guān)資料,這里對(duì)有序數(shù)組的合并分享了java版本和C語(yǔ)言版本的示例,需要的朋友可以參考下2017-08-08java Callable接口和Future接口創(chuàng)建線程示例詳解
這篇文章主要為大家介紹了java Callable接口和Future接口創(chuàng)建線程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11mybatis-plus阻止全表更新與刪除的實(shí)現(xiàn)
BlockAttackInnerInterceptor 是mybatis-plus的一個(gè)內(nèi)置攔截器,用于防止惡意的全表更新或刪除操作,本文主要介紹了mybatis-plus阻止全表更新與刪除的實(shí)現(xiàn),感興趣的可以了解一下2023-12-12簡(jiǎn)單了解java標(biāo)識(shí)符的作用和命名規(guī)則
這篇文章主要介紹了簡(jiǎn)單了解java標(biāo)識(shí)符的作用和命名規(guī)則,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01Spring Data Jpa實(shí)現(xiàn)自定義repository轉(zhuǎn)DTO
這篇文章主要介紹了Spring Data Jpa實(shí)現(xiàn)自定義repository轉(zhuǎn)DTO,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08JavaWeb實(shí)戰(zhàn)之編寫單元測(cè)試類測(cè)試數(shù)據(jù)庫(kù)操作
這篇文章主要介紹了JavaWeb實(shí)戰(zhàn)之編寫單元測(cè)試類測(cè)試數(shù)據(jù)庫(kù)操作,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)javaweb的小伙伴們有很大的幫助,需要的朋友可以參考下2021-04-04Java線程之守護(hù)線程(Daemon)用法實(shí)例
這篇文章主要介紹了Java線程之守護(hù)線程(Daemon)用法,較為詳細(xì)的分析了守護(hù)線程的功能與實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07