如何在Swagger UI 3.x中通过OpenAPI 2.0 YAML设置非默认请求体内容类型
解决Swagger UI 3.x不显示自定义请求体内容类型的问题
首先得确认你的Swagger 2.0 YAML配置是正确的——一定要把consumes字段放在操作(operation)级别(操作级配置会覆盖全局配置),示例如下:
swagger: '2.0' info: title: FHIR API version: 1.0.0 paths: /Patient: post: summary: 创建FHIR患者资源 # 操作级consumes,明确指定自定义媒体类型 consumes: - application/json+fhir - application/xml+fhir parameters: - name: patientResource in: body required: true description: 待创建的FHIR患者资源 schema: $ref: '#/definitions/Patient' responses: 201: description: 患者资源创建成功
如果YAML配置没问题但Swagger UI仍只显示application/json,问题出在Swagger UI 3.x的默认逻辑:它会自动过滤掉非标准的媒体类型。你可以通过以下两种方式解决:
方法1:修改Swagger UI初始化配置(推荐)
如果你是自行部署Swagger UI,在初始化SwaggerUIBundle时添加contentTypeOptions配置项,手动把自定义类型加入支持列表:
const ui = SwaggerUIBundle({ url: '/path/to/your/swagger.yaml', dom_id: '#swagger-ui', presets: [ SwaggerUIBundle.presets.apis, SwaggerUIStandalonePreset ], // 关键配置:列出所有需要显示的内容类型 contentTypeOptions: [ 'application/json+fhir', 'application/xml+fhir', 'application/json' // 按需保留默认类型 ], // 可选:设置默认选中的内容类型 defaultContentType: 'application/json+fhir' })
方法2:URL参数临时调试(快速验证)
如果不想修改代码,可以开启Swagger UI的临时配置功能,在访问Swagger UI的URL后追加参数:?config={"contentTypeOptions":["application/json+fhir","application/xml+fhir"]}
比如完整URL可能是:http://your-swagger-ui-domain/?config={"contentTypeOptions":["application/json+fhir","application/xml+fhir"]}
这个方法适合快速验证配置逻辑,不用改动部署代码。
为什么Swagger Editor能正常显示?
Swagger Editor和Swagger UI共享部分组件,但前者对自定义媒体类型的兼容性更好,不会默认过滤非标准类型,所以你的YAML在编辑器里能正常展示所有配置的内容类型。
内容的提问来源于stack exchange,提问作者Jonny Rylands
相关产品推荐
相关产品推荐

