3
votes

Golang Validator avec des structures personnalisées

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"`
}


0 commentaires

3 Réponses :


1
votes

À 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"`
    ...
}


2 commentaires

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



1
votes

Il y a deux façons de le faire

  1. Supérieur à : Pour les nombres, cela garantira que la valeur est supérieure au paramètre donné. Pour les chaînes, il vérifie que la longueur de la chaîne est supérieure à ce nombre de caractères. Pour les tranches, les tableaux et les cartes, il valide le nombre d'éléments.

Exemple:

Rules       []Rule    `json:"rules" db:"rules" validate:"min=3"`
  1. Minimum : Pour les nombres, min garantit que la valeur est supérieure ou égale au paramètre donné. Pour les chaînes, il vérifie que la longueur de la chaîne est au moins égale à ce nombre de caractères. Pour les tranches, les tableaux et les cartes, valide le nombre d'éléments.

Exemple:

Rules       []Rule    `json:"rules" db:"rules" validate:"gt=2"` 


2 commentaires

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 []



0
votes

Vous pouvez utiliser dive pour dire au validateur de plonger dans une tranche:

Rules       []Rule    `json:"rules" db:"rules" validate:"dive"`


0 commentaires