J'essaie d'utiliser le Golang Validator ( https://godoc.org/gopkg.in/go-playground/validator.v9 ) pour valider un corps de requête. J'ai deux entités, Rule et Item. L'entité Item repose sur l'entité Rule.
func (item *Item) Validate() error { v := validator.New() if err := v.Struct(item); err != nil { return err } return nil }
Comment puis-je valider qu'un corps de requête a une liste de règles pour le champ "Règles" de la structure d'élément? C'est ma fonction de validation:
type Rule struct { RuleNo int64 `json:"ruleNo" db:"rule_no"` Category string `json:"category" db:"category" validate:"alphanum"` CreatedAt time.Time `json:"createdAt" db:"created_at"` UpdatedAt time.Time `json:"updatedAt" db:"updated_at"` } type Item struct { SeqNo int64 `json:"-" db:"item_restriction_no"` ItemId string `json:"itemId" db:"item_id" validate:"alphanum"` ItemType string `json:"itemType" db:"item_type" validate:"alphanum"` Rules []Rule `json:"rules" db:"rules"` // how to validate this field? CreatedAt time.Time `json:"createdAt" db:"created_at"` UpdatedAt time.Time `json:"updatedAt" db:"updated_at"` }
3 Réponses :
À partir de l'exemple ici , vous pouvez faire quelque chose comme ci-dessous:
type Rule struct { ... } type Item struct { ... Rules []Rule `json:"rules" db:"rules" validate:"required"` ... }
Cela ne vérifie-t-il pas seulement que le champ Règles est obligatoire pour le corps de la demande? Comment puis-je vérifier que le champ "Rules" dans le corps de la requête correspond à celui de ma structure?
Cela ne sera pas nécessaire car Go garantit que Item.Rules
sera toujours un tableau de Rule
. Veuillez consulter cet exemple: play.golang.org/p/Rb_oAy7gcdm
Il y a deux façons de le faire
Exemple:
Rules []Rule `json:"rules" db:"rules" validate:"min=3"`
Exemple:
Rules []Rule `json:"rules" db:"rules" validate:"gt=2"`
Oui, je sais que je peux vérifier la longueur du tableau, mais existe-t-il un moyen de vérifier que chaque objet est un objet Rule? Que faire si l'utilisateur saisit des nombres entiers au lieu d'objets de règle dans la liste? Alors ça ne marcherait pas
Golang est un langage typé statiquement. Vous ne pouvez pas mettre de nombres entiers dans la règle []
Vous pouvez utiliser dive pour dire au validateur de plonger dans une tranche:
Rules []Rule `json:"rules" db:"rules" validate:"dive"`