为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
Helenr 2022-12-05 17:15:07
type Person struct {  Id       string  Roll_no  int  Email    string  `json:"email" validate:"required"`}这里的电子邮件是必需的。如果用户没有在 API 调用的请求正文中提供该字段,Go 是否会自动处理名称验证并在未提供此字段时抛出错误?或者我需要在我的代码中手动验证它并以某种形式的 http 状态代码抛出错误?
查看完整描述

2 回答

?
慕虎7371278

TA贡献1802条经验 获得超4个赞

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

不,出于很多原因。

  1. 一些结构标签(例如 json 标签)仅被包 encoding/json 用于在 JSON 对象元素和结构字段之间进行映射)。

  2. 某些 3rd 方包使用其他结构标记(如验证),如果您不使用该包,则什么也不会发生。

  3. Go(语言及其标准库)“没有魔法”。没有什么神奇的事情发生。如果您需要在 API 端点上进行验证,您可以使用检查结构标签的验证包,但这不会神奇地发生:您必须调用这些函数并自己返回 API 错误。不,我不会在这里推荐一个框架。

  4. 要工作,struct 标签必须是有效的,你的都不是。跑去go vet找这类问题。(应该json:"emal" validate:"required"甚至可能是“电子邮件”)

  5. Go 中的错误根本不会“抛出”。特别是状态代码为 400 Bad Request 的 HTTP 响应不会被“抛出”。它总是有助于使术语正确)。


查看完整回答
反对 回复 2022-12-05
?
慕标琳琳

TA贡献1830条经验 获得超9个赞

如果通过 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


查看完整回答
反对 回复 2022-12-05
  • 2 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信