Golang API中的奇怪请求主体

时间:2017-10-10 06:10:55

标签: mongodb go

我使用golang和ravel创建了一个API服务器。在其中一种POST方法中,我需要在保存之前读取正文并将其解码为模型。但它没有这样做。这是我使用https://medium.com/@kyawmyintthein/revel-mgo-restful-generator-for-revel-web-framework-mongodb-86209de3977e

的指南

预期的行为是在mongoDB中创建用户对象。但是我收到了错误回复。将其解码为用户结构时出现问题。

控制器方法:

func (c UserController) Create() revel.Result {

    fmt.Print("Body: ")
    fmt.Println(c.Request.Body)
    var (
        user models.User
        err  error
    )

    err = json.NewDecoder(c.Request.Body).Decode(&user)
    if err != nil {
        errResp := buildErrResponse(err, "403")
        c.Response.Status = 403
        return c.RenderJSON(errResp)
    }

    user, err = models.AddUser(user)
    if err != nil {
        errResp := buildErrResponse(err, "500")
        c.Response.Status = 500
        return c.RenderJSON(errResp)
    }
    c.Response.Status = 201
    return c.RenderJSON(user)
}

用户模型:

package models

import (
    "gopkg.in/mgo.v2/bson"
    "time"
    "userAPI/app/models/mongodb"
)

type User struct {
    ID        bson.ObjectId `json:"id" bson:"_id"`
    Name      string        `json:"name" bson:"name"`
    Email     string        `json:"email" bson:"email"`
    Phone     string        `json:"phone" bson:"phone"`
    Username  string        `json:"username" bson:"username"`
    CreatedAt time.Time     `json:"created_at" bson:"created_at"`
    UpdatedAt time.Time     `json:"updated_at" bson:"updated_at"`
}

POST请求中使用的JSON正文

{
    "name":"kanishka",
    "email":"kanishka@gmail.com",
    "phone":"91238901238",
    "username":"k"
}

这是我得到的回应

{
    "error_code": "403",
    "error_message": "EOF"
}

控制器方法顶部的println(c.Request.Body)输出显示

  

& {0xc4202ffa80 false true {0 0} true false false   0x12a1430}

这是我第一次尝试golang。请帮我进一步。

1 个答案:

答案 0 :(得分:1)

搜索后,我找到了this issue #1011。引用回复:

  

Revel会自动调用ParseForm,ParseMultipartForm或请求所需的任何函数,因此会解析req.Body并将所有有价值的信息存储到controller.Params。(固定,路由,查询,表单,文件)。

这意味着,在调用您的控制器方法之前,revel已经读取了请求正文,因此当您再次尝试阅读时,结果将为EOF。从the docs开始,不要使用json.Decoder和请求正文,请尝试以下操作:

c.Params.BindJSON(&user)