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

OpenAPI定义PATCH接口:如何强制要求请求头携带Content-Type?

PATCH端点Content-Type校验问题处理

我正在实现一个PATCH端点,需要严格遵循RFC规范,不允许请求者遗漏请求头中的Content-Type字段。

我的OpenAPI规范.yml配置如下:

parameters: (...)
requestBody:
  description: Some description here...
  required: true
  content:
    application/json-patch+json:
      schema:
        $ref: some-valid-shcema-reference-here
responses: (...)

当前配置的执行结果:

  • 请求头设置Content-type: application/json-patch+json时,不会返回400,控制器代码正常执行——符合预期;
  • 请求头设置非application/json-patch+json的Content-type值时,返回400——符合预期;
  • 请求头未设置任何Content-type值时,不会返回400,控制器代码直接执行——不符合预期。

问题

  1. 如何要求用户必须设置Content-Type?(类似参数的"required"标记)
  2. 为什么未设置Content-Type时,指定的application/json-patch+json会被默认使用?

解决方案

问题1:强制要求Content-Type请求头

在OpenAPI规范中,通过显式定义Content-Type请求头参数并标记为必填即可实现强制校验:

parameters:
  - name: Content-Type
    in: header
    required: true
    schema:
      type: string
      enum:
        - application/json-patch+json
requestBody:
  description: Some description here...
  required: true
  content:
    application/json-patch+json:
      schema:
        $ref: some-valid-shcema-reference-here
responses: (...)

配置后,请求缺少Content-Type头时会直接返回400错误,符合RFC对PATCH请求的要求(PATCH请求必须携带正确的Content-Type以指明补丁格式)。

问题2:未设置Content-Type时默认使用指定类型的原因

这是多数OpenAPI实现框架(如Spring Boot、FastAPI等)的默认容错机制:当请求未携带Content-Type时,框架会自动使用requestBody的content字段中定义的唯一(或首个)媒体类型作为解析依据,默认认为请求体符合application/json-patch+json格式,因此不会触发错误校验,直接进入控制器执行逻辑。

这种行为不符合严格的RFC规范,所以需要通过显式定义必填的Content-Type请求头来覆盖默认逻辑。


内容的提问来源于stack exchange,提问作者jaume

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 08:57:18