'How to decode query parameter in golang

i have parameter

id_user
phone_number

I want to decode to my struct

type User struct{
     IDUser int `json:"id_user"`
     PhoneNumber string `json:"phone_number"`
}

is it possible to decode into struct? I use gorilla schema. My Code:

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 input id_user = 1 and phone_number = qwerty. But the result is id_user = 0 and phone_number = "".



Solution 1:[1]

I think you should fix your tags from this:

type User struct{
    IDUser         int     `json:id_user`
    PhoneNumber    string  `json:phone_number`
}

to this:

type User struct{
    IDUser         int     `json:"id_user"`
    PhoneNumber    string  `json:"phone_number"`
}

So, you should use quotes in tag names.

Solution 2:[2]

If you want to decode them directly into a structure without getting the values of the fields one by one then you can use github.com/gorilla/schema. Refer to this question.

Solution 3:[3]

This answer may not be suitable for the question since the op was seeking help of using gorilla/schema package.

However, if someone were looking for a package to decode HTTP query params into a struct in Go, I will recommend an awesome package here:

ggicci/httpin

Disclaimer: I'm the creator and maintainer of this package.

httpin helps you easily decoding HTTP request data from

  • Query parameters, e.g. ?name=john&is_member=true
  • Headers, e.g. Authorization: xxx
  • Form data, e.g. username=john&password=******
  • JSON/XML Body, e.g. POST {"name":"john"}
  • Path variables, e.g. /users/{username}
  • File uploads

How to use?

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 is:

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 V. Panchenko
Solution 2 Said Saifi
Solution 3