关于openfeign调用时content-type的问题

这篇具有很好参考价值的文章主要介绍了关于openfeign调用时content-type的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题1描述:

今天在A服务使用openfeign调用B服务的时候,发现经常会偶发性报错。错误如下:关于openfeign调用时content-type的问题,java,java,spring,springcloud,openfeign,content-type
情况为偶发,很让人头疼。
两个接口如下:
A服务接口:
关于openfeign调用时content-type的问题,java,java,spring,springcloud,openfeign,content-type
delayReasonApi.test(student);就是使用openfeign调用B服务的接口。
B服务接口:
关于openfeign调用时content-type的问题,java,java,spring,springcloud,openfeign,content-type

原因分析:

因为A服务的接口是一个文件上传的接口,所以前端请求头中使用的是multipart/form-data 来请求的该接口。而B服务的接口是一个用json接口参数的接口,所以需要请求头中的Content-Type为application/json。

如果在上面都没有配置过的情况下,在B服务的接口参数使用@RequestBody注解来接受的时候,openfeign是会默认使用application/json 的content-type来进行请求的。代码如下:
关于openfeign调用时content-type的问题,java,java,spring,springcloud,openfeign,content-type
但是一般我们都会在项目中加上openfeign的配置文件,将目前的所有的header中的参数全部写入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在前面:

关于openfeign调用时content-type的问题,java,java,spring,springcloud,openfeign,content-type
关于openfeign调用时content-type的问题,java,java,spring,springcloud,openfeign,content-type
我估计B服务在拿的时候只那集合中的第一个,但是我没找源码嘿嘿。当multipart/form-data在前面的时候,就会报上面的错误。

所以这个时候就有一个解决办法:

把我们的配置类中的代码进行修改,跳过content-type的赋值。
关于openfeign调用时content-type的问题,java,java,spring,springcloud,openfeign,content-type
如此,openfeign就只会用默认的application/json进行请求了。

问题2描述:

延续上面的问题,当我修改了配置类之后,发现还是会有这样的情况,后来发现是我们的微服务的项目中有两个服务都写了openfeign的配置类,而这两个配置类都被引用在了A服务中。openfeign在调用接口的时候会先迭代所有的配置类,导致前面的情况又重演了一遍。
关于openfeign调用时content-type的问题,java,java,spring,springcloud,openfeign,content-type

解决方法:

删掉一个配置类。

问题3:

继续上面的情况,如果B服务的接口也是个文件上传接口,那么这个时候也是需要使用multipart/form-data的,那这个时候需要怎么做呢?openfeign是否会默认使用multipart/form-data呢?
B接口如下:
关于openfeign调用时content-type的问题,java,java,spring,springcloud,openfeign,content-type

测试结果:

content-type为空,并且会报错
关于openfeign调用时content-type的问题,java,java,spring,springcloud,openfeign,content-type
关于openfeign调用时content-type的问题,java,java,spring,springcloud,openfeign,content-type

解决办法:

在B接口上加上 consumes = “multipart/form-data”
关于openfeign调用时content-type的问题,java,java,spring,springcloud,openfeign,content-type
此时content-type就有值了。
关于openfeign调用时content-type的问题,java,java,spring,springcloud,openfeign,content-type文章来源地址https://www.toymoban.com/news/detail-653394.html

end!!!

到了这里,关于关于openfeign调用时content-type的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端篇-Content-Type 详解

    Content-Type(MediaType),即是Internet Media Type,互联网媒体类型,也叫做MIME类型。在互联网中有成百上千中不同的数据类型,HTTP在传输数据对象时会为他们打上称为MIME的数据格式标签,用于区分数据类型。最初MIME是用于电子邮件系统的,后来HTTP也采用了这一方案。 在HTTP协议

    2024年04月27日
    浏览(49)
  • http中的Content-Type类型

    最近在做web端下载的时候需要给前端返回一个二进制的流,需要在请求头中设置一个 那么http中的Content-Type有具体有哪些呢?他们具体的使用场景又是怎样的呢? MediaType,即是Internet Media Type,互联网媒体类型;也叫做MIME类型,在Http协议消息头中,使用Content-Type来表示具体请

    2024年02月06日
    浏览(54)
  • 详解Http的Content-Type

    目录 1.概述 2.常用类型 2.1.application/x-www-form-urllencoded 2.2.application/json 3.Spring MVC支持的编码 3.1.实验 3.2.适配器 3.3.自定义适配器 HTTP(HyperText Transfer Protocol),超文本传输协议。超文本(Hypertext)是一种结构化的文本,其中包含了超链接(Hyperlink)的能力,通过超链接可以在不

    2024年02月09日
    浏览(40)
  • Http Content-type 对照表

    文件扩展名 Content-Type(Mime-Type) 文件扩展名 Content-Type(Mime-Type) .*( 二进制流,不知道下载文件类型) application/octet-stream .tif image/tiff .001 application/x-001 .301 application/x-301 .323 text/h323 .906 application/x-906 .907 drawing/907 .a11 application/x-a11 .acp audio/x-mei-aac .ai application/postscript .aif audio/aiff

    2024年02月09日
    浏览(45)
  • content-type几种常见类型区别

    Content-Type叫做MIME(mediaType)类型,使用Content-Type来表示请求和响应中的媒体类型信息。如果是请求头,它用来告诉服务端如何处理请求的数据,如果是响应头,它用来告诉客户端(一般是浏览器)如何解析响应的数据。下面我们来介绍下常用的几种类型! 1.application/x-www-form

    2024年02月03日
    浏览(49)
  • 前端知识~Content-Type和Accept

    Content-Type和Accept是两个HTTP标头(HTTP headers),用于在HTTP请求和响应之间传递有关请求的数据类型和响应的首选内容类型的信息。这两个标头在HTTP通信中起着关键的作用。 Content-Type: Content-Type 是HTTP请求头或响应头的一部分,用于指示HTTP消息主体(请求或响应体)的媒体类

    2024年02月10日
    浏览(40)
  • Http请求中的Content-Type

    前阵子公司接回了一个旧的项目,刚开始的时候没有注意看前端设置的content-type,然后与后端同事进行接口联调的时候就,有时候发现数据就是对不上,后面看了一下代码中的axios请求相关设置,才发现是自己走坑了!主要是在请求拦截和响应拦截这块的处理,请求拦截这块

    2024年02月12日
    浏览(85)
  • 如何在 Postman 中设置 Content-Type?

    在使用  Postman  进行 API 测试时,有时需要设置请求的 Content-Type。本文将介绍如何在 Postman 中设置 Content-Type。想要学习更多关于 Postman 的知识,可访问 Postman 中文文档。 1、首先,打开 Postman 工具并创建一个新的请求接口。输入请求地址,例如  https://api.example.com/user 。 2、

    2024年02月08日
    浏览(58)
  • HTTP的Content-type 和 responseType

    后端返回字节流,前端进行图片下载时遇到了问题,定位花了不少时间,本文再次记录梳理下  XMLHttpRequest本身支持responseType 允许我们手动的设置返回数据的类型 \\\'\\\' responseType 为空字符串时,采用默认类型 DOMString,与设置为 text 相同。 arraybuffer response 是一个包含二进制数据的

    2024年01月22日
    浏览(39)
  • 浏览器响应数据类型(Content-Type)详解

    浏览器要显示内容,首先需要判断响应消息中的数据属于哪种类型。Web 可以处理的数据包括文字、图像、声音、视频等多种类型,每种数据的显示方法都不同,因此必须先要知道返回了什么类型的数据,否则无法正确显示。 这时,我们需要一些信息才能判断数据类型,原则

    2024年02月11日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包