我正在驗證由請求生成的引數,但與在 JSON 中發出請求不同的是,我無法輕松地將查詢引數轉換為它的結構對應物。使用以下內容:
https://thedevsaddam.medium.com/an-easy-way-to-validate-go-request-c15182fd11b1
type ItemsRequest struct {
Item string `json:"item"`
}
func ValidateItemRequest(r *http.Request, w http.ResponseWriter) map[string]interface{} {
var itemRequest ItemsRequest
rules := govalidator.MapData{
"item": []string{"numeric"},
}
opts := govalidator.Options{
Request: r,
Rules: rules,
Data: &itemRequest ,
RequiredDefault: true,
}
v := govalidator.New(opts)
e := v.Validate()
// access itemsRequest.item
}
如果我使用e.ValidateJSON()并通過主體傳遞資料,這將起作用
如果我使用e.Validate()并通過 url 引數傳遞資料,這將不起作用。
我認為json結構中的標簽是問題所在,但洗掉它會產生相同的結果。我不認為 Validate() 應該填充結構,但是我應該如何傳入 URL 的值?
我知道我可以使用r.URL.Query().Get()手動拉入每個值,但是在我剛剛驗證了我想要的一切之后,這似乎是多余的。
uj5u.com熱心網友回復:
https://pkg.go.dev/github.com/gorilla/schema可以為您完成繁重的作業,轉換url.Values為 astruct并進行一些模式驗證。
它支持結構欄位標記,非常類似于 - 并且與 - json 兼容,并且還可以與例如表單資料或多部分表單資料一起使用。
package main
import(
"github.com/gorilla/schema"
"net/url"
"fmt"
)
type Person struct {
Name string
Phone string
}
func main() {
var decoder = schema.NewDecoder()
u, err := url.Parse("http://localhost/?name=daniel&phone=612-555-4321")
if err != nil { panic(err) }
var person Person
err = decoder.Decode(&person, u.Query())
if err != nil {
// Handle error
}
fmt.Printf("% v\n", person)
}
uj5u.com熱心網友回復:
首先使用查詢中的值填充結構,然后驗證它:
q:=request.URL.Query()
myStruct:= {
Field1: q.Get("field1"),
Field2: q.Get("field2"),
...
}
// Deal with non-string fields
// Validate the struct
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/352547.html
上一篇:預期切片但有介面
