最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決openfeign調(diào)用時(shí)content-type的問題

 更新時(shí)間:2026年01月13日 09:31:09   作者:哈哈哈哈哈基米  
文章主要描述了在使用OpenFeign調(diào)用其他服務(wù)時(shí)遇到的偶發(fā)性報(bào)錯(cuò)問題,問題原因在于請(qǐng)求頭中Content-Type的不一致,通過修改OpenFeign的配置類或調(diào)整服務(wù)引用的配置類數(shù)量,解決了這個(gè)問題,同時(shí),還討論了當(dāng)B服務(wù)接口也是文件上傳接口時(shí)的解決方案

問題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è)參考,也希望大家多多支持腳本之家。 

相關(guān)文章

最新評(píng)論

张家界市| 光山县| 黄浦区| 汨罗市| 来安县| 临汾市| 永修县| 乌兰察布市| 墨玉县| 略阳县| 根河市| 中阳县| 晋城| 寿光市| 盐津县| 兴国县| 万安县| 中方县| 衡阳市| 荆门市| 蕉岭县| 双城市| 秦皇岛市| 鄂尔多斯市| 岳西县| 镇安县| 星子县| 长治县| 平乡县| 翁牛特旗| 棋牌| 安宁市| 桦甸市| 电白县| 塘沽区| 南开区| 泾源县| 叶城县| 禹城市| 安宁市| 额尔古纳市|