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

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

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

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

但是一般我們都會(huì)在項(xiàng)目中加上openfeign的配置文件,將目前的所有的header中的參數(shù)全部寫入openfeign的請(qǐng)求中,如下:
@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);
}
}
}
}
}
這樣就導(dǎo)致,我A服務(wù)接口使用的是multipart/form-data,而B服務(wù)接口需要的是application/json,而我的配置類會(huì)把A接口的multipart/form-data寫到請(qǐng)求頭中,這樣就會(huì)導(dǎo)致openfeign在請(qǐng)求的時(shí)候會(huì)有兩個(gè)content-Type,而且這兩個(gè)值的順序是不一定的,有的時(shí)候application/json在前面,有的時(shí)候multipart/form-data在前面:


我估計(jì)B服務(wù)在拿的時(shí)候只那集合中的第一個(gè),但是我沒找源碼嘿嘿。當(dāng)multipart/form-data在前面的時(shí)候,就會(huì)報(bào)上面的錯(cuò)誤。
所以這個(gè)時(shí)候就有一個(gè)解決辦法
把我們的配置類中的代碼進(jìn)行修改,跳過content-type的賦值。

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

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

測(cè)試結(jié)果
content-type為空,并且會(huì)報(bào)錯(cuò)


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

此時(shí)content-type就有值了。

end!!!
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringBoot項(xiàng)目整合OpenFeign啟動(dòng)失敗及運(yùn)行時(shí)常見錯(cuò)誤解決方案
- SpringCloud OpenFeign的使用舉例詳解
- openfeign使用nacos服務(wù)注冊(cè)方式調(diào)用的實(shí)現(xiàn)
- springcloud openFeign客戶端禁用SSL驗(yàn)證
- Spring Cloud OpenFeign實(shí)現(xiàn)動(dòng)態(tài)服務(wù)名調(diào)用的示例代碼
- SpringBoot整合OpenFeign的完整指南
- Spring Cloud之遠(yuǎn)程調(diào)用OpenFeign參數(shù)傳遞
相關(guān)文章
微信公眾號(hào)獲取access_token的方法實(shí)例分析
這篇文章主要介紹了微信公眾號(hào)獲取access_token的方法,結(jié)合實(shí)例形式分析了java實(shí)現(xiàn)微信公眾號(hào)獲取access_token的相關(guān)原理、實(shí)現(xiàn)方法及操作注意事項(xiàng),需要的朋友可以參考下2019-10-10
如何使用Spring Cloud Feign日志查看請(qǐng)求響應(yīng)
這篇文章主要介紹了如何使用Spring Cloud Feign日志查看請(qǐng)求響應(yīng),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02
java實(shí)現(xiàn)哈弗曼編碼與反編碼實(shí)例分享(哈弗曼算法)
本文介紹java實(shí)現(xiàn)哈弗曼編碼與反編碼實(shí)例,大家參考使用吧2014-01-01
springboot+vue前后端分離項(xiàng)目中使用jwt實(shí)現(xiàn)登錄認(rèn)證
本文介紹了如何在SpringBoot+Vue前后端分離的項(xiàng)目中使用JWT實(shí)現(xiàn)登錄認(rèn)證,內(nèi)容包括后端的響應(yīng)工具類、JWT工具類、登錄用戶實(shí)體類、登錄接口、測(cè)試接口、過濾器、啟動(dòng)類以及前端的登錄頁面實(shí)現(xiàn),感興趣的可以了解一下2024-10-10
RabbitMQ,RocketMQ,Kafka?事務(wù)性,消息丟失,消息順序性和消息重復(fù)發(fā)送的處理策略問題
這篇文章主要介紹了RabbitMQ,RocketMQ,Kafka?事務(wù)性,消息丟失,消息順序性和消息重復(fù)發(fā)送的處理策略,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
SpringBoot中的CompletableFuture類詳解
這篇文章主要介紹了SpringBoot中的CompletableFuture類詳解,在?Java8中,引入了CompletableFuture類,它提供了一種簡(jiǎn)單而強(qiáng)大的方式來執(zhí)行異步任務(wù),今天我們就來詳細(xì)解讀一下這個(gè)類,需要的朋友可以參考下2023-07-07
SpringBoot整合Zookeeper實(shí)現(xiàn)分布式鎖的具體步驟
在 Spring Boot 中實(shí)現(xiàn)分布式鎖通??梢岳?nbsp;ZooKeeper 來實(shí)現(xiàn),以下是整合 Spring Boot 和 ZooKeeper 實(shí)現(xiàn)分布式鎖的基本步驟,需要的朋友可以參考下2025-11-11
Java數(shù)據(jù)類型(八種基本數(shù)據(jù)類型+四種引用類型)以及數(shù)據(jù)類型轉(zhuǎn)換
java中除了基本數(shù)據(jù)類型之外,剩下的都是引用數(shù)據(jù)類型,下面這篇文章主要給大家介紹了關(guān)于Java數(shù)據(jù)類型(八種基本數(shù)據(jù)類型?+?四種引用類型)以及數(shù)據(jù)類型轉(zhuǎn)換的相關(guān)資料,需要的朋友可以參考下2024-04-04

