使用 go-gin 和 openapi 时访问内部模型信息

问题描述 投票:0回答:1

我正在使用 swagger/openapi 编写一个简单的 REST 接口。在 openapi 中,我指定一些参数是“必需的”。例如,/api/v1/device 是 REST 端点。 Device 对象有一些属性,但 Serial、Vendor 和 Model 是必需的。

在 openapi.yaml 文件中,我为设备提供了以下内容:

required: [Serial, Vendor, Model]

使用

"openapi-generator-cli generate -g  go-gin-server"
生成的代码生成以下内容。
type Device struct { Name string 
json:"名称,omitempty"
Description string
json:"描述,omitempty"`` 串行字符串
json:"Serial"
// 供应商(或制造商)的名称。 供应商字符串
json:"Vendor"
型号字符串
json:"Model"
}`

令我惊讶的是,Device 结构体没有 Serial、Vendor 和 Model 的“required”标签。我的想法是,当我使用 ShouldBindJSON() 方法将传入数据绑定到

Device 
对象时,如果缺少任何必需字段,则 ShouldBindJSON 调用应该失败。然而,这不是我观察到的,绑定只是顺利进行,没有任何错误。

在搜索更多信息时,我偶然发现了这篇文章https://gin-gonic.com/docs/examples/binding-and-validation/。 在这里,我看到了以下结构字段的装饰。

User     string 
表单:“用户” json:“用户” xml:“用户”绑定:“必需”``

添加“绑定:必需”后,如果缺少任何必填字段,ShouldBindJSON 调用将失败。

我不确定如何让 go-gin 在从 openapi 规范生成代码时将

"binding:required"
装饰添加到我的 Device 结构中。 我不喜欢手动编辑 go-gin 生成的代码来添加装饰,因为每次运行 make 命令时生成的文件都会被覆盖。

问题:

  1. 有什么方法可以指示 go-gin 生成带有“binding:required”装饰的代码吗?
  2. 或者,如果#1 不可能,我想我可以编写代码来检查生成的结构并检查结构中的每个字段以查看是否需要它(缺少“omitempty”装饰)。但是,我如何访问 go-gin 内部使用的元数据。 go-gin 确实有一个输出其模型的选项(debugModels=true),它只是将模型信息转储到屏幕上。但是,我需要访问代码中的模型。

感谢任何指点。 -kD

尝试了不同的方法来解决问题

go openapi model-binding go-gin
1个回答
0
投票

有一种可行的解决方案。装饰是结构的一部分,因此我可以使用结构上的反射来确定每个结构字段上的装饰。这是我用来打印装饰的一段代码

    package main
    
    import (
         "fmt"
         "reflect"
    )
    
    type Device struct {
            Name string `json:"name,omitempty"`
            Description string `json:"description,omitempty"`
            Serial string `json:"Serial"`
    }
    func main() {
    
        var dev Device
        rType := reflect.TypeOf(dev)
        // Traverse through all the fields of a struct.
        if rType.Kind() == reflect.Struct {
            for i := 0; i < rType.NumField(); i++ {
                fieldValue := rType.Field(i)
                fmt.Printf("fld: %v\n", fieldValue)
            }
        }
    }

This generates the output:
fld: {Name  string json:"name,omitempty" 0 [0] false}
fld: {Description  string json:"description,omitempty" 16 [1] false}
fld: {Serial  string json:"Serial" 32 [2] false}

使用上述方法,我可以使用 go generics 编写一段通用代码来检查结构是否具有“omitempty”装饰,然后检查结构的传入值对象并验证是否填充了非空字段。

想知道是否有更好的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.