解決openfeign調用時content-type的問題
問題1描述
今天在A服務使用openfeign調用B服務的時候,發(fā)現(xiàn)經(jīng)常會偶發(fā)性報錯。
錯誤如下:

情況為偶發(fā),很讓人頭疼。
兩個接口如下:
A服務接口:

delayReasonApi.test(student);就是使用openfeign調用B服務的接口。
B服務接口:

原因分析
因為A服務的接口是一個文件上傳的接口,所以前端請求頭中使用的是multipart/form-data 來請求的該接口。而B服務的接口是一個用json接口參數(shù)的接口,所以需要請求頭中的Content-Type為application/json。
如果在上面都沒有配置過的情況下,在B服務的接口參數(shù)使用@RequestBody注解來接受的時候,openfeign是會默認使用application/json 的content-type來進行請求的。
代碼如下:

但是一般我們都會在項目中加上openfeign的配置文件,將目前的所有的header中的參數(shù)全部寫入openfeign的請求中,如下:
@Component
public class FeignConfiguration implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
.getRequestAttributes();
if (attributes != null) {
HttpServletRequest request = Objects.requireNonNull(attributes).getRequest();
Enumeration<String> headerNames = request.getHeaderNames();
if (headerNames != null) {
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
String values = request.getHeader(name);
template.header(name, values);
}
}
}
}
}
這樣就導致,我A服務接口使用的是multipart/form-data,而B服務接口需要的是application/json,而我的配置類會把A接口的multipart/form-data寫到請求頭中,這樣就會導致openfeign在請求的時候會有兩個content-Type,而且這兩個值的順序是不一定的,有的時候application/json在前面,有的時候multipart/form-data在前面:


我估計B服務在拿的時候只那集合中的第一個,但是我沒找源碼嘿嘿。當multipart/form-data在前面的時候,就會報上面的錯誤。
所以這個時候就有一個解決辦法
把我們的配置類中的代碼進行修改,跳過content-type的賦值。

如此,openfeign就只會用默認的application/json進行請求了。
問題2描述
延續(xù)上面的問題,當我修改了配置類之后,發(fā)現(xiàn)還是會有這樣的情況,后來發(fā)現(xiàn)是我們的微服務的項目中有兩個服務都寫了openfeign的配置類,而這兩個配置類都被引用在了A服務中。
openfeign在調用接口的時候會先迭代所有的配置類,導致前面的情況又重演了一遍。

解決方法
刪掉一個配置類。
問題3
繼續(xù)上面的情況,如果B服務的接口也是個文件上傳接口,那么這個時候也是需要使用multipart/form-data的,那這個時候需要怎么做呢?openfeign是否會默認使用multipart/form-data呢?
B接口如下:

測試結果
content-type為空,并且會報錯


解決辦法
在B接口上加上 consumes = “multipart/form-data”

此時content-type就有值了。

end!!!
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
如何使用Spring Cloud Feign日志查看請求響應
這篇文章主要介紹了如何使用Spring Cloud Feign日志查看請求響應,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-02-02
java實現(xiàn)哈弗曼編碼與反編碼實例分享(哈弗曼算法)
本文介紹java實現(xiàn)哈弗曼編碼與反編碼實例,大家參考使用吧2014-01-01
springboot+vue前后端分離項目中使用jwt實現(xiàn)登錄認證
本文介紹了如何在SpringBoot+Vue前后端分離的項目中使用JWT實現(xiàn)登錄認證,內容包括后端的響應工具類、JWT工具類、登錄用戶實體類、登錄接口、測試接口、過濾器、啟動類以及前端的登錄頁面實現(xiàn),感興趣的可以了解一下2024-10-10
RabbitMQ,RocketMQ,Kafka?事務性,消息丟失,消息順序性和消息重復發(fā)送的處理策略問題
這篇文章主要介紹了RabbitMQ,RocketMQ,Kafka?事務性,消息丟失,消息順序性和消息重復發(fā)送的處理策略,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03
SpringBoot中的CompletableFuture類詳解
這篇文章主要介紹了SpringBoot中的CompletableFuture類詳解,在?Java8中,引入了CompletableFuture類,它提供了一種簡單而強大的方式來執(zhí)行異步任務,今天我們就來詳細解讀一下這個類,需要的朋友可以參考下2023-07-07
SpringBoot整合Zookeeper實現(xiàn)分布式鎖的具體步驟
在 Spring Boot 中實現(xiàn)分布式鎖通??梢岳?nbsp;ZooKeeper 來實現(xiàn),以下是整合 Spring Boot 和 ZooKeeper 實現(xiàn)分布式鎖的基本步驟,需要的朋友可以參考下2025-11-11
Java數(shù)據(jù)類型(八種基本數(shù)據(jù)類型+四種引用類型)以及數(shù)據(jù)類型轉換
java中除了基本數(shù)據(jù)類型之外,剩下的都是引用數(shù)據(jù)類型,下面這篇文章主要給大家介紹了關于Java數(shù)據(jù)類型(八種基本數(shù)據(jù)類型?+?四種引用類型)以及數(shù)據(jù)類型轉換的相關資料,需要的朋友可以參考下2024-04-04

