Rumah >pembangunan bahagian belakang >Golang >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.
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?
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!