如何在golang中解码查询参数
How to decode query parameter in golang
我有参数
id_user
phone_number
我想解码成我的结构
type User struct{
IDUser int `json:"id_user"`
PhoneNumber string `json:"phone_number"`
}
是否可以解码成结构体?我使用大猩猩模式。我的代码:
func User(w http.ResponseWriter, r *http.Request){
var decoder = schema.NewDecoder()
var user User
if err := r.ParseForm(); err != nil {
fmt.Println(err)
}
err := decoder.Decode(&user, r.PostForm)
if err != nil {
fmt.Println(err)
}
respBody, err := json.Marshal(user)
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
w.Write(respBody)
}
i 输入 id_user = 1 和 phone_number = qwerty。但结果是 id_user = 0 和 phone_number = "".
我认为你应该修复你的标签:
type User struct{
IDUser int `json:id_user`
PhoneNumber string `json:phone_number`
}
对此:
type User struct{
IDUser int `json:"id_user"`
PhoneNumber string `json:"phone_number"`
}
因此,您应该在标签名称中使用引号。
如果你提到的两个字段是查询参数,你可以直接这样读取:
func User(w http.ResponseWriter, r *http.Request) {
idUser := r.URL.Query().Get("id_user")
phoneNumber := r.URL.Query().Get("phone_number")
var user User
id, err := strconv.Atoi(idUser)
if err != nil {
fmt.Println("error converting string to int")
return
}
user.IDUser = id
user.PhoneNumber = phoneNumber
respBody, _ := json.Marshal(user)
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
w.Write(respBody)
}
否则你可以直接在 api payload 中传递 User struct 并直接像这样进行 payLoad 解码
if err := json.NewDecoder(r.Body).Decode(&user); err != nil {
fmt.Println("error decoding api payload")
return
}
如果你想直接将它们解码成一个结构而不是一个一个地获取字段的值,那么你可以使用github.com/gorilla/schema
。参考.
这个答案可能不适合这个问题,因为 op 正在寻求使用 gorilla/schema 包的帮助。
但是,如果有人正在寻找一个包来将 HTTP 查询参数解码为 Go 中的结构,我会在这里推荐一个很棒的包:
ggicci/httpin
免责声明:我是这个包的创建者和维护者。
httpin帮你轻松解码来自
的HTTP请求数据
- 查询参数,例如
?name=john&is_member=true
- Headers,例如
Authorization: xxx
- 表单数据,例如
username=john&password=******
- JSON/XMLBody,例如
POST {"name":"john"}
- 路径变量,例如
/users/{username}
- 文件上传
如何使用?
type ListUsersInput struct {
Page int `in:"query=page"`
PerPage int `in:"query=per_page"`
IsMember bool `in:"query=is_member"`
}
func ListUsers(rw http.ResponseWriter, r *http.Request) {
input := r.Context().Value(httpin.Input).(*ListUsersInput)
if input.IsMember {
// Do sth.
}
// Do sth.
}
httpin 是:
- 有据可查:在https://ggicci.github.io/httpin/
- 测试良好:覆盖率超过98%
- 开放集成:与net/http, go-chi/chi, gorilla/mux, gin-gonic/gin等
- 可扩展(高级功能):通过添加自定义指令。阅读 httpin - custom directives 了解更多详情。
- 提到很棒:https://github.com/avelino/awesome-go#forms
我有参数
id_user
phone_number
我想解码成我的结构
type User struct{
IDUser int `json:"id_user"`
PhoneNumber string `json:"phone_number"`
}
是否可以解码成结构体?我使用大猩猩模式。我的代码:
func User(w http.ResponseWriter, r *http.Request){
var decoder = schema.NewDecoder()
var user User
if err := r.ParseForm(); err != nil {
fmt.Println(err)
}
err := decoder.Decode(&user, r.PostForm)
if err != nil {
fmt.Println(err)
}
respBody, err := json.Marshal(user)
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
w.Write(respBody)
}
i 输入 id_user = 1 和 phone_number = qwerty。但结果是 id_user = 0 和 phone_number = "".
我认为你应该修复你的标签:
type User struct{
IDUser int `json:id_user`
PhoneNumber string `json:phone_number`
}
对此:
type User struct{
IDUser int `json:"id_user"`
PhoneNumber string `json:"phone_number"`
}
因此,您应该在标签名称中使用引号。
如果你提到的两个字段是查询参数,你可以直接这样读取:
func User(w http.ResponseWriter, r *http.Request) {
idUser := r.URL.Query().Get("id_user")
phoneNumber := r.URL.Query().Get("phone_number")
var user User
id, err := strconv.Atoi(idUser)
if err != nil {
fmt.Println("error converting string to int")
return
}
user.IDUser = id
user.PhoneNumber = phoneNumber
respBody, _ := json.Marshal(user)
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
w.Write(respBody)
}
否则你可以直接在 api payload 中传递 User struct 并直接像这样进行 payLoad 解码
if err := json.NewDecoder(r.Body).Decode(&user); err != nil {
fmt.Println("error decoding api payload")
return
}
如果你想直接将它们解码成一个结构而不是一个一个地获取字段的值,那么你可以使用github.com/gorilla/schema
。参考
这个答案可能不适合这个问题,因为 op 正在寻求使用 gorilla/schema 包的帮助。
但是,如果有人正在寻找一个包来将 HTTP 查询参数解码为 Go 中的结构,我会在这里推荐一个很棒的包:
ggicci/httpin
免责声明:我是这个包的创建者和维护者。
httpin帮你轻松解码来自
的HTTP请求数据- 查询参数,例如
?name=john&is_member=true
- Headers,例如
Authorization: xxx
- 表单数据,例如
username=john&password=******
- JSON/XMLBody,例如
POST {"name":"john"}
- 路径变量,例如
/users/{username}
- 文件上传
如何使用?
type ListUsersInput struct {
Page int `in:"query=page"`
PerPage int `in:"query=per_page"`
IsMember bool `in:"query=is_member"`
}
func ListUsers(rw http.ResponseWriter, r *http.Request) {
input := r.Context().Value(httpin.Input).(*ListUsersInput)
if input.IsMember {
// Do sth.
}
// Do sth.
}
httpin 是:
- 有据可查:在https://ggicci.github.io/httpin/
- 测试良好:覆盖率超过98%
- 开放集成:与net/http, go-chi/chi, gorilla/mux, gin-gonic/gin等
- 可扩展(高级功能):通过添加自定义指令。阅读 httpin - custom directives 了解更多详情。
- 提到很棒:https://github.com/avelino/awesome-go#forms