Maison > développement back-end > Golang > Validez les champs de saisie en utilisant deux noms possibles

Validez les champs de saisie en utilisant deux noms possibles

王林
Libérer: 2024-02-08 22:33:08
avant
1023 Les gens l'ont consulté

Validez les champs de saisie en utilisant deux noms possibles

l'éditeur php Strawberry vous présente une méthode pour valider les champs de saisie : utilisez deux noms possibles pour la validation. La validation des champs de saisie est une étape très importante lors du développement d’un site internet ou d’une application. En utilisant deux noms possibles, vous pouvez augmenter la sécurité et la précision de vos champs de saisie. Cette méthode est validée en comparant le nom réel du champ de saisie avec un autre nom. Si les deux noms correspondent, le champ de saisie est considéré comme valide. Cette méthode de vérification évite les problèmes causés par des erreurs de saisie utilisateur ou des saisies malveillantes et offre une protection des données plus fiable.

Contenu de la question

Je migre une API initialement écrite en Python. L'API Python vous permet d'envoyer des requêtes sous forme camelCase ou Snake_case comme suit :

C'est autorisé

<code>{
    "someInput": "nice"
}
</code>
Copier après la connexion

C'est autorisé

<code>{
    "some_input": "nice"
}
</code>
Copier après la connexion

Cela se fait à l'aide d'une excellente bibliothèque Python : Pydantic

<code>from pydantic import BaseModel

def to_camel(string):
    words = string.split('_')
    return words[0] + ''.join(word.capitalize() for word in words[1:])

class InputModel(BaseModel):
    some_input: str

    class Config:
        alias_generator = to_camel
        allow_population_by_field_name = True
</code>
Copier après la connexion

Cela permet de créer des InputModels par alias (someInput) ou nom de champ (some_input). Je veux faire la même chose ou une chose équivalente dans Go. J'utilise du gin :

<code>func Routes(router *gin.Engine) {
    v1 := router.Group("/v1")
    {
        v1.POST("/shipments", controllers.ShipmentCreator)
    }
}

func ShipmentCreator(ctx *gin.Context) {
    ResponseController := new(internal.OutputModel)
    var body domain.ShipmentsInputModel
    if err := ctx.BindJSON(&body); err != nil {
        fmt.Println(err)
    }
    validate := validator.New()
    err := validate.Struct(body)
    if err != nil {
        var validationErrors validator.ValidationErrors
        errors.As(err, &validationErrors)
        for _, validationError := range validationErrors {
            ResponseController.AddError(internal.ErrorsModel{
                Parameter: validationError.Field(),
                Message:   validationError.Error(),
            })
        }
        ctx.JSON(http.StatusBadRequest, ResponseController)
        return
    }

</code>
Copier après la connexion

Ma structure de saisie ressemble à ceci :

<code>type ShipmentsInputModel struct {
    LotId   string   `json:"lotId" tag:"lot_id" alias:"lot_id" validate:"required"`
}
</code>
Copier après la connexion

Cela ne fonctionne pas lorsque ma saisie est : 

<code>{
   "lot_id": "someLotId"
}
</code>
Copier après la connexion

Il revient :

"message": "Key: 'ShipmentsInputModel.LotId' Error:Field validation for 'LotId' failed on the 'required' tag",
Copier après la connexion

Comment puis-je accepter à la fois camelCase et Snake_case ?

Solution de contournement

Dans Go, vous ne pouvez pas fournir deux balises JSON pour un seul champ de structure en même temps. Les balises JSON sont spécifiées à l'aide d'une chaîne unique qui définit la manière dont un champ doit être marshalé (sérialisé en JSON) ou non marshalé (désérialisé à partir de JSON). Vous ne pouvez pas spécifier directement plusieurs étiquettes pour un seul champ dans une structure.

Si vous devez prendre en charge CamelCase et SnakeCase dans la sortie JSON, vous devez généralement choisir une convention de dénomination cohérente pour les champs de structure, puis utiliser le balisage JSON approprié pour tous les champs.

Il existe une façon intelligente de procéder. J'espère que ça aide.

    package main
    
    import (
        "encoding/json"
        "fmt"
    )
    
    type ShipmentsInputModel struct {
        LotID
    }
    
    type LotID struct {
        LotId  string `json:"lotId,omitempty"`
        Lot_ID string `json:"lot_id,omitempty"`
    }
    
    func (s *ShipmentsInputModel) setLodID(id string) {
        s.LotId = id
        s.Lot_ID = id
    }
    
    func main() {
        shipment := ShipmentsInputModel{}
        shipment.setLodID("someLotID")
    
        // Convert struct to JSON
        jsonData, err := json.Marshal(shipment)
        if err != nil {
            fmt.Println("Error:", err)
            return
        }
        // prints: {"lotId":"someLotID","lot_id":"someLotID"}
        fmt.Println(string(jsonData))
    }
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal