是否struct标签抛出错误的API用户?


type Person struct {
Id       string
Roll_no  int
Email    string  `json:"email" validate:"required"`
}

这里的电子邮件是必需的。如果用户没有在API调用的请求体中提供该字段,Go是否会自动处理名称验证并在没有提供此字段时抛出错误?或者我需要在我的代码中手动验证它并以某种形式的http状态码抛出错误?

是否struct标签向API用户抛出错误?

。有很多原因。

  1. 一些结构标签(例如json的)只是被包编码/json用来映射json对象元素和结构字段)。

  2. 其他struct标签(如validate)由某些第三方包使用,如果您不使用该包,则根本不会发生任何事情。

  3. Go(语言和它的标准库)是"没有魔法的"。没有什么奇迹会发生。如果你需要在你的API端点上进行验证,你可能会使用检查struct标签的验证包,但这不会神奇地发生:你必须调用这些函数并自己返回一个API错误。不,我不会在这里推荐一个框架。

  4. 要工作结构体标签必须是有效的,你的都不是。运行go vet查找此类问题。(应该是json:"emal" validate:"required",甚至可能是"email")

  5. Go中的错误不会被"抛出";在所有。特别是状态码为400 Bad Request的HTTP响应不会被"抛出"。正确使用术语总是有帮助的)。

如果通过API发送的JSON不包含Email,那么encoding/jsonjson.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

相关内容

  • 没有找到相关文章

最新更新