Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Sahkan medan input menggunakan dua nama yang mungkin

Sahkan medan input menggunakan dua nama yang mungkin

王林
王林ke hadapan
2024-02-08 22:33:08986semak imbas

Sahkan medan input menggunakan dua nama yang mungkin

editor php Strawberry memperkenalkan anda kaedah untuk mengesahkan medan input: gunakan dua nama yang mungkin untuk pengesahan. Pengesahan medan input adalah langkah yang sangat penting semasa membangunkan laman web atau aplikasi. Dengan menggunakan dua nama yang mungkin, anda boleh meningkatkan keselamatan dan ketepatan medan input anda. Kaedah ini mengesahkan dengan membandingkan nama sebenar medan input dengan nama ganti. Jika kedua-dua nama sepadan, medan input dianggap sah. Kaedah pengesahan ini mengelakkan masalah yang disebabkan oleh ralat input pengguna atau input berniat jahat dan menyediakan perlindungan data yang lebih dipercayai.

Kandungan soalan

Saya sedang memindahkan API yang asalnya ditulis dalam Python. API Python membolehkan anda menghantar permintaan dalam bentuk camelCase atau snake_case seperti berikut:

Ini dibenarkan

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

Ini dibenarkan

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

Ini dilakukan menggunakan perpustakaan Python yang hebat: 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>

Ini membolehkan mencipta InputModels dengan alias (someInput) atau nama medan (some_input). Saya mahu melakukan perkara yang sama atau setara dalam Go. Saya menggunakan 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>

Struktur input saya kelihatan seperti ini:

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

Ini tidak berfungsi apabila input saya ialah:

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

Ia kembali:

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

Bagaimana saya boleh menerima kedua-dua camelCase dan snake_case?

Penyelesaian

Dalam Go, anda tidak boleh menyediakan dua tag JSON untuk satu medan struct pada masa yang sama. Teg JSON ditentukan menggunakan rentetan tunggal yang mentakrifkan cara medan harus disusun (diserialisasikan kepada JSON) atau dinyahmarshall (diserialisasi daripada JSON). Anda tidak boleh menentukan secara langsung berbilang label untuk satu medan dalam struktur.

Jika anda perlu menyokong CamelCase dan SnakeCase dalam output JSON, anda biasanya perlu memilih konvensyen penamaan yang konsisten untuk medan struktur dan kemudian menggunakan penanda JSON yang sesuai untuk semua medan.

Ada cara bijak untuk melakukan ini. Saya harap ini membantu.

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

Atas ialah kandungan terperinci Sahkan medan input menggunakan dua nama yang mungkin. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Artikel sebelumnya:Gorm padam klausa ujian sqlmockArtikel seterusnya:Gorm padam klausa ujian sqlmock