【问题标题】:How to decode query parameter in golang如何在golang中解码查询参数
【发布时间】:2018-05-24 16:45:04
【问题描述】:

我有参数

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)
}

我输入 id_user = 1 和 phone_number = qwerty。但结果是 id_user = 0 和 phone_number = ""。

【问题讨论】:

  • 解码正文不是“查询参数”。把逻辑和语义搞清楚,剩下的就简单了。
  • 在这里输出您实际收到的内容,一切可能都会变得清晰。您可能只是以错误的格式接收参数(作为 url 参数或以其他方式编码在正文中)。

标签: go struct gorilla


【解决方案1】:

我认为你应该从这里修复你的标签:

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"`
}

因此,您应该在标签名称中使用引号。

【讨论】:

  • 哈哈谢谢。好的,我在我的问题中编辑。我已经在我的代码中使用了标签名称..
  • 如果此答案正确且适合您 - 请将其标记为“答案”)
  • 我已经在使用标签名称,但这并不能解决我的问题。在我的问题中,我忘了添加标签名称。
【解决方案2】:

如果您提到的两个字段是查询参数,您可以这样直接读取:

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
    }

【讨论】:

    【解决方案3】:

    如果您想直接将它们解码成一个结构,而不是一一获取字段的值,那么您可以使用github.com/gorilla/schema。参考this question

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-25
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      相关资源
      最近更新 更多