使用大猩猩的schema
包装
该
github.com/gorilla/schema包装正是为此而发明的。
您可以使用struct标记]来告诉如何将URL参数映射到struct字段,
schema程序包会寻找
"schema"标记键。
使用它:
import "github.com/gorilla/schema"type Filter struct { Offset int64 `schema:"offset"` Limit int64 `schema:"limit"` SortBy string `schema:"sortby"` Asc bool `schema:"asc"` //User specific filters Username string `schema:"username"` First_Name string `schema:"first_name"` Last_Name string `schema:"last_name"` Status string `schema:"status"`}func MyHandler(w http.ResponseWriter, r *http.Request) { if err := r.ParseForm(); err != nil { // Handle error } filter := new(Filter) if err := schema.NewDeprer().Depre(filter, r.Form); err != nil { // Handle error } // Do something with filter fmt.Printf("%+v", filter)}封送和解封使用 json
请注意,
schema程序包还将尝试将参数值转换为字段的类型。
如果该结构仅包含
[]string类型的字段(或者您愿意做出让步),则可以在不使用
schema包的情况下执行此操作。
Request.Form是一个
map从
string到的映射
[]string(因为一个参数可能会在URL中多次列出:
Form url.Values
和
url.Values:
type Values map[string][]string
因此,例如,如果您的
Filter结构如下所示:
type Filter struct { Offset []string `json:"offset"` Limit []string `json:"limit"` SortBy []string `json:"sortby"` // ..other fields}您可以简单地使用该
json软件包进行封送
r.Form,然后将其解封到您的结构中:
func MyHandler(w http.ResponseWriter, r *http.Request) { if err := r.ParseForm(); err != nil { // Handle error } data, err := json.Marshal(r.Form) if err != nil { // Handle error } filter := new(Fiter) if err = json.Unmarshal(data, filter); err != nil { // Handle error } fmt.Printf("%+v", filter)}此解决方案处理是否为同一参数名称提供了多个值。如果您不关心多个值,而只想要一个,则必须首先将“”转换
r.Form为
map单个
string值而不是
[]string。
它看起来像这样:
type Filter struct { Offset string `json:"offset"` Limit string `json:"limit"` SortBy string `json:"sortby"` // ..other fields}// Transformation from map[string][]string to map[string]string:m := map[string]string{}for k, v := range r.Form { m[k] = v[0]}然后您可以以相同的方式
m将其编入
Filter结构并将其编入结构。



