type Person struct {
Id string
Roll_no int
Email string `json:"email" validate:"required"`
}
这里的电子邮件是必需的。如果用户没有在API调用的请求体中提供该字段,Go是否会自动处理名称验证并在没有提供此字段时抛出错误?或者我需要在我的代码中手动验证它并以某种形式的http状态码抛出错误?
是否struct标签向API用户抛出错误?
。有很多原因。
-
一些结构标签(例如json的)只是被包编码/json用来映射json对象元素和结构字段)。
-
其他struct标签(如validate)由某些第三方包使用,如果您不使用该包,则根本不会发生任何事情。
-
Go(语言和它的标准库)是"没有魔法的"。没有什么奇迹会发生。如果你需要在你的API端点上进行验证,你可能会使用检查struct标签的验证包,但这不会神奇地发生:你必须调用这些函数并自己返回一个API错误。不,我不会在这里推荐一个框架。
-
要工作结构体标签必须是有效的,你的都不是。运行
go vet
查找此类问题。(应该是json:"emal" validate:"required"
,甚至可能是"email") -
Go中的错误不会被"抛出";在所有。特别是状态码为400 Bad Request的HTTP响应不会被"抛出"。正确使用术语总是有帮助的)。
如果通过API发送的JSON不包含Email
,那么encoding/json
json.Unmarshal
将把它视为Email
是一个空字符串。
选项A:如果空字符串不是有效的Email
,您可以检查json.Unmarshal
后的空字符串
var person Person
err := json.Unmarshal(jsonBlob, &person)
if err != nil{
return err
}
if person.Email == "" {
return errors.New("email cannon be empty"
}
选项B:如果空字符串是有效的,你可以创建一个自定义的MarshalJSON
来解析JSON作为一个字符串,并寻找Email
键。
https://pkg.go.dev/encoding/json example-package-CustomMarshalJSON