You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用RestAssuredMockMvc与Spring REST Docs时Content-Type头重复问题

RestAssuredMockMvc + Spring REST Docs Content-Type头重复问题解答

问题背景

使用RestAssuredMockMvc结合Spring REST Docs编写测试用例时,在全局测试配置中通过headers()方法设置了AUTHORIZATION、ACCEPT及Content-Type: application/json请求头,但生成的http-request.adoc文档中出现两个相同的Content-Type: application/json头。经调试发现,Spring的MockHttpServletRequest中Content-Type头已被重复设置(早于文档处理环节),取消注释modifyHeaders().set(...)代码可消除重复。查看MockHttpServletRequest#addHeader逻辑后,了解到该方法允许添加重复头,但两者结合时引发文档展示异常。


1. 此重复现象是否为两者结合时的预期行为?

不是预期行为,但属于组件特性叠加导致的场景问题:

  • RestAssuredMockMvc通过headers()配置头时,内部调用的是addHeader逻辑,会追加头而非覆盖;
  • Spring的MockHttpServletRequest本身允许同名请求头重复存在(符合Servlet规范);
  • 同时,当请求体为JSON格式时,RestAssured或Spring MockMvc内部可能自动添加Content-Type: application/json头,和手动配置的头叠加后就出现了重复。

2. 有无更优雅的方式避免Content-Type头重复添加?

推荐以下几种更简洁的方案:

  • 依赖自动配置,不手动添加:如果请求体是JSON格式(比如用body()传入JSON对象/字符串),RestAssured会自动添加Content-Type: application/json,无需手动配置,从根源避免重复;
  • 用header()替代headers()批量设置:header("Content-Type", "application/json")会覆盖已存在的同名头,而headers()是追加逻辑,改用单个header()方法可避免重复;
  • 全局配置默认Content-Type:在RestAssured全局配置中设置默认的Content-Type,无需手动在请求头中添加:
    RestAssuredMockMvc.config = RestAssuredMockMvc.config()
        .encoderConfig(encoderConfig().defaultContentContentType(ContentType.JSON));
    
  • 文档生成环节去重:自定义Spring REST Docs的过滤器,在生成http-request.adoc前对请求头进行去重,保留唯一的Content-Type项。

3. 该问题应由开发者、RestAssured还是Spring来处理?

  • Spring:MockHttpServletRequest允许重复头是符合Servlet规范的设计,无需修改;
  • RestAssured:可考虑在结合Spring MockMvc的场景中,对Content-Type这类特殊头默认采用覆盖逻辑,属于优化方向,但并非必须修复的bug;
  • 开发者:最直接的解决路径是通过调整配置或请求写法规避(比如上述方案),因为这是组件特性叠加导致的场景问题,开发者可通过合理配置快速解决。

内容的提问来源于stack exchange,提问作者오태현

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 04:22:38