我正在使用 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 命令时生成的文件都会被覆盖。
问题:
感谢任何指点。 -kD
尝试了不同的方法来解决问题
有一种可行的解决方案。装饰是结构的一部分,因此我可以使用结构上的反射来确定每个结构字段上的装饰。这是我用来打印装饰的一段代码
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”装饰,然后检查结构的传入值对象并验证是否填充了非空字段。
想知道是否有更好的解决方案。