【问题标题】:Is there a simpler way to implement a JSON REST service with net/http?有没有更简单的方法来使用 net/http 实现 JSON REST 服务?
【发布时间】:2014-05-12 10:48:36
【问题描述】:

我正在尝试使用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"]
    ...
}

如您所见,它需要相当多的行才能提取第一个参数。有什么想法吗?

【问题讨论】:

    标签: json http rest go httpserver


    【解决方案1】:

    如果请求正文将包含 JSON 结构并且您不需要任何 URL 参数,则无需调用 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)
    
    }
    

    不过,如果您可以正式定义您期望在 struct 类型中的输入结构,那就更好了:

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

    并使用此结构的实例而不是更通用的映射。

    【讨论】:

    • 非常感谢您的广泛回答。我想知道:您在 UserId 字段中设置的 json:"uid" 规范是什么?这是语言功能吗?
    • 不客气。这是一个结构字段标记,在解码时由json 包读取。此处记录了它们的解释方式:golang.org/pkg/encoding/json/#Marshal
    猜你喜欢
    • 1970-01-01
    • 2012-07-18
    • 2022-01-09
    • 2017-12-18
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多