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

时间:2014-05-12 10:48:37

标签: json http rest go httpserver

我正在尝试使用net/http开发 REST 服务。

服务接收包含所有输入参数的JSON结构。我想知道是否有更简单,更短的方式来实现以下内容:

func call(w http.ResponseWriter, r *http.Request) {
    if err := r.ParseForm(); err != nil {
        fmt.Printf("Error parsing request %s\n", 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\n", err)
    }
    var uid = decoded["uid"]
    ...
}

正如您所看到的,只需要提取第一个参数就需要很多行。有什么想法吗?

1 个答案:

答案 0 :(得分:6)

如果请求正文包含JSON结构且您不需要任何网址参数,则无需致电r.ParseForm

你也不需要缓冲;你可以使用:

decoder := json.NewDecoder(r.Body)

然后:

error := decoder.Decode(decoded)

全部放在一起:

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)

}

如果你能正式定义你在结构类型中期望的输入结构,那将会更好:

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

并使用此结构的实例而不是更通用的地图。