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

Sahkan medan input menggunakan dua nama yang mungkin

王林
Lepaskan: 2024-02-08 22:33:08
ke hadapan
1026 orang telah melayarinya

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>
Salin selepas log masuk

Ini dibenarkan

<code>{
    "some_input": "nice"
}
</code>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

Struktur input saya kelihatan seperti ini:

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

Ini tidak berfungsi apabila input saya ialah:

<code>{
   "lot_id": "someLotId"
}
</code>
Salin selepas log masuk

Ia kembali:

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

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))
    }
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan