type Person struct {
Id string
Roll_no int
Email string `json:"email" validate:"required"`
}
此處的電子郵件是必需的。如果用戶在 API 呼叫的請求正文中沒有提供,Go 會自動處理名稱驗證并在未提供此欄位時拋出錯誤?或者我是否需要在我的代碼中手動驗證它并以某種形式的 http 狀態代碼拋出錯誤?
uj5u.com熱心網友回復:
struct 標簽會向 API 用戶拋出錯誤嗎?
不,有很多原因。
一些結構標記(例如 json 標記)僅被包 encoding/json 用于在 JSON 物件元素和結構欄位之間進行映射)。
某些 3rd 方包使用其他結構標記(如 validate),如果您不使用該包,則根本不會發生任何事情。
Go(語言及其標準庫)“沒有魔法”。沒有什么神奇的事情發生。如果您需要在 API 端點上進行驗證,您可能會使用檢查結構標簽的驗證包,但這不會神奇地發生:您必須自己呼叫這些函式并回傳 API 錯誤。不,我不會在這里推薦一個框架。
為了作業結構標簽必須是有效的,你的都不是。運行
go vet以查找此類問題。(應該json:"emal" validate:"required"甚至可能是“電子郵件”)Go 中的錯誤根本不會被“拋出”。特別是狀態代碼為 400 Bad Request 的 HTTP 回應不會被“拋出”。正確使用術語總是有幫助的)。
uj5u.com熱心網友回復:
如果通過 API 發送的 JSON 不包含Emailthenencoding/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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/466893.html
