如何在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 是: