嗨,我想将get查询参数转换为Go中的结构,例如,我具有以下结构:
type Filter struct {
Offset int64 `json:"offset"`
Limit int64 `json:"limit"`
SortBy string `json:"sortby"`
Asc bool `json:"asc"`
//User specific filters
Username string `json:"username"`
First_Name string `json:"first_name"`
Last_Name string `json:"last_name"`
Status string `json:"status"`
}
我有一个发送GET请求该情况下,用户可以指定可选参数Offset
,Limit
,SortBy
,Asc
,Username
,First_Name
,Last_Name
,Status
。
如果这些参数是在正文中发送的,那么我会这样做:
b, err := ioutil.ReadAll(r.Body)
if err != nil {
log.WithFields(logFields).Errorf("Reading Body Message:failed:%v", err)
return
}
var filter Filter
err = json.Unmarshal(b, &filter)
但是我无法在GET
请求中发送正文,所以解决方案是什么呢?而不是单独获取每个参数然后将其放入结构中?
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.NewDecoder().Decode(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
结构并将其编入结构。
问题内容: 服务类具有一个接受多个参数的操作。这些参数作为查询参数传递给服务调用。 这些参数的列表正在增长,因此我想将它们放入包含所有这些参数的单个bean中。 你会怎么做?这有可能吗? 问题答案: 您可以使用。 在您的资源中,您只需要使用。 提供者将被自动调用。
将jwt(json web令牌)作为GET请求的查询参数放入url是否安全?
Magento的1.9RESTAPI需要授权头和oauth查询参数,但oauth()只允许OAuthSignature。标题或查询字符串 我追踪代码到com.jayway.restassured.internal.httpAuthConfig.process(...),但我不确定从这里做什么。 问:有没有过滤器或某种方法可以让我强制两者? TL;DR我首先提到这个:如何使用POSTMAN rest
今天调用了一个接口,接口要求传一个日期过去,当时没仔细看(因为文档也没写请求参数和相应参数),以为是传一个data,里面有条件查询的参数之类的,结果第一次报错。 Required request parameter 'date' for method parameter type String is not present(方法参数类型字符串所需的请求参数“日期”不存在) 后面第二次调用的时候注意
我在一个资源上创建了一个GET方法,链接到一个Lambda函数,我正在尝试传递一些查询参数。 我希望传递给lambda变量