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

Validez les champs de saisie en utilisant deux noms possibles

王林
王林avant
2024-02-08 22:33:08985parcourir

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>

C'est autorisé

<code>{
    "some_input": "nice"
}
</code>

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>

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>

Ma structure de saisie ressemble à ceci :

<code>type ShipmentsInputModel struct {
    LotId   string   `json:"lotId" tag:"lot_id" alias:"lot_id" validate:"required"`
}
</code>

Cela ne fonctionne pas lorsque ma saisie est : 

<code>{
   "lot_id": "someLotId"
}
</code>

Il revient :

"message": "Key: 'ShipmentsInputModel.LotId' Error:Field validation for 'LotId' failed on the 'required' tag",

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))
    }

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer