我使用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。请帮我进一步。
答案 0 :(得分:1)
搜索后,我找到了this issue #1011。引用回复:
Revel会自动调用ParseForm,ParseMultipartForm或请求所需的任何函数,因此会解析req.Body并将所有有价值的信息存储到controller.Params。(固定,路由,查询,表单,文件)。
这意味着,在调用您的控制器方法之前,revel
已经读取了请求正文,因此当您再次尝试阅读时,结果将为EOF
。从the docs开始,不要使用json.Decoder
和请求正文,请尝试以下操作:
c.Params.BindJSON(&user)