结构标签是否向 API 用户抛出错误?
Do struct tags throw error to the API user?
type Person struct {
Id string
Roll_no int
Email string `json:"email" validate:"required"`
}
这里的电子邮件是必需的。如果用户没有在 API 调用的请求正文中提供,如果没有提供此字段,Go 会自动处理名称验证并抛出错误吗?或者我需要在我的代码中手动验证它并以某种形式的 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
Do struct tags throw error to the API user?
没有。原因很多。
一些结构标签(例如 json 标签)仅被包 encoding/json 用于在 JSON 对象元素和结构字段之间进行映射。
某些第 3 方包使用其他结构标记(如验证),如果您不使用该包,则什么也不会发生。
Go(语言及其标准库)“没有魔法”。没有什么神奇的事情发生。如果您需要在 API 端点上进行验证,您可以使用检查结构标签的验证包,但这不会神奇地发生:您必须自己调用这些函数和 return 一个 API 错误。不,我不会在这里推荐框架。
要工作,结构标签必须有效,none 是。 运行 go vet
查找此类问题。 (应该是 json:"emal" validate:"required"
甚至可能是“电子邮件”)
Go 中的错误根本不会“抛出”。特别是状态代码为 400 Bad Request 的 HTTP 响应不会被“抛出”。正确使用术语总是有帮助的。
type Person struct {
Id string
Roll_no int
Email string `json:"email" validate:"required"`
}
这里的电子邮件是必需的。如果用户没有在 API 调用的请求正文中提供,如果没有提供此字段,Go 会自动处理名称验证并抛出错误吗?或者我需要在我的代码中手动验证它并以某种形式的 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
Do struct tags throw error to the API user?
没有。原因很多。
一些结构标签(例如 json 标签)仅被包 encoding/json 用于在 JSON 对象元素和结构字段之间进行映射。
某些第 3 方包使用其他结构标记(如验证),如果您不使用该包,则什么也不会发生。
Go(语言及其标准库)“没有魔法”。没有什么神奇的事情发生。如果您需要在 API 端点上进行验证,您可以使用检查结构标签的验证包,但这不会神奇地发生:您必须自己调用这些函数和 return 一个 API 错误。不,我不会在这里推荐框架。
要工作,结构标签必须有效,none 是。 运行
go vet
查找此类问题。 (应该是json:"emal" validate:"required"
甚至可能是“电子邮件”)Go 中的错误根本不会“抛出”。特别是状态代码为 400 Bad Request 的 HTTP 响应不会被“抛出”。正确使用术语总是有帮助的。