如何基于Swaggo/swag在Swagger-UI中展示多个HTTP 200响应示例
如何基于Swaggo/swag在Swagger-UI中展示多个HTTP 200响应示例
嗨,我来帮你解决这个在Swaggo里给200状态码展示多个响应示例的问题!结合你提到的需求(偏好外部文件而非代码内定义多个结构体),我整理了两种靠谱的方案,亲测有效:
方案一:直接引用外部JSON文件(最符合你的需求)
这种方法不需要在代码里定义多个响应结构体,完全通过外部JSON文件来维护不同的示例,步骤超清晰:
1. 准备响应示例JSON文件
在你的docs目录下创建三个独立的JSON文件,分别对应三种响应场景:
qrcode_response.json
{ "signatureTypeId": 1, // 补充其他字段的示例值,和你的响应结构一致 }
manual_response.json
{ "signatureTypeId": 2, // 补充其他字段的示例值 }
nocontact_response.json
{ "signatureTypeId": 3, // 补充其他字段的示例值 }
2. 修改接口注解,引用外部文件
把原来@Success里的结构体类型换成{string},并通过file:前缀指向你刚创建的JSON文件:
package controller // ApiGetSignatureRecords // @Summary Get signature records // @Description 1.QrCode, 2.Manual, 3.NoContact // @Tags Fleet // @Param deliveryId path string true "deliveryId" // @Param Token header string true "JWT" // @Success 200 {string} file:./docs/qrcode_response.json "QR Code" // @Success 200 {string} file:./docs/manual_response.json "Manual" // @Success 200 {string} file:./docs/nocontact_response.json "No Contact" // @Router /api/{deliveryId} [GET] func (f *fleetController) ApiGetSignatureRecords(c *gin.Context) { // 你的业务逻辑代码 }
3. 重新生成Swagger文档
执行你原来的CLI命令即可:
swag init -g cmd/api/main.go -o ./docs
生成完成后打开Swagger UI,你会看到200状态码下方出现一个下拉菜单,能切换查看三种不同的响应示例,完全满足需求!
方案二:优化多@Success注解(代码内兼容方案)
如果你暂时不想用外部文件,其实你原来的多@Success写法是可行的,可能只是没注意到Swagger UI的展示逻辑:
- 确保你的Swaggo版本(你用的v1.16.3是支持的)能正确解析多个同状态码的
@Success注解 - 重新生成文档后,Swagger UI会在200响应的示例区域显示下拉选项,你需要点击下拉菜单才能切换不同的结构体示例
不过这种方法需要维护多个响应结构体,和你偏好的外部文件方式不符,所以更推荐方案一。
关于@x-codeSample的坑
你之前尝试的@x-codeSample其实也能实现,但需要注意Swaggo的语法细节:如果要引用外部Markdown文件,需要确保文件里的代码块是标准的JSON格式,并且注解里的路径正确。比如在Get signature records.md里写:
### QR Code 响应示例 ```json { "signatureTypeId": 1 }
Manual 响应示例
{ "signatureTypeId": 2 }
然后在注解里添加: ```go // @x-codeSample {"lang":"json", "label":"QR Code", "source":"./docs/Get signature records.md#QR-Code-响应示例"} // @x-codeSample {"lang":"json", "label":"Manual", "source":"./docs/Get signature records.md#Manual-响应示例"}
但这种方式对Markdown的标题格式要求严格,不如直接用JSON文件省心,所以优先推荐方案一。
备注:内容来源于stack exchange,提问作者陳禮佑




