有没有更简单的方法来使用net / http实现JSON REST服务?

I am trying to develop a REST service with net/http.

The service receives a JSON structure containing all the input parameters. I wonder if there is an easier and shorter way to implement the following:

func call(w http.ResponseWriter, r *http.Request) {
    if err := r.ParseForm(); err != nil {
        fmt.Printf("Error parsing request %s
", err)
    }
    var buf []byte
    buf = make([]byte, 256)
    var n, err = r.Body.Read(buf)
    var decoded map[string]interface{}
    err = json.Unmarshal(buf[:n], &decoded)
    if err != nil {
        fmt.Printf("Error decoding json: %s
", err)
    }
    var uid = decoded["uid"]
    ...
}

As you can see it requires quite a number of lines just to get to the extraction of the first parameter. Any ideas?

You don't need to call r.ParseForm if the body of the request will contain a JSON structure and you don't need any URL parameters.

You don't need the buffer either; you can use:

decoder := json.NewDecoder(r.Body)

And then:

error := decoder.Decode(decoded)

Putting it all together:

func call(w http.ResponseWriter, r *http.Request) {

    values := make(map[string]interface{})

    if error := json.NewDecoder(r.Body).Decode(&values); error != nil {
        panic(error)
    }

    uid := values["uid"].(int)

}

It would be much nicer, though, if you could formally define the structure of the input that you're expecting in a struct type:

type UpdateUserInformationRequest struct {
    UserId int `json:"uid"`
    // other fields...
}

And use an instance of this struct instead of a more general map.