You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何基于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,提问作者陳禮佑

火山引擎 最新活动