【问题标题】:Strange Request Body in Golang APIGolang API 中的奇怪请求正文
【发布时间】:2017-10-10 06:10:55
【问题描述】:

我已经使用 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 假真{0 0}真假假 0x12a1430}

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

【问题讨论】:

  • 请提供一个minimal 代码示例,并说明您的预期输出。你得到的输出是 Go 打印结构的标准方式,在本例中是 Body。
  • 确保您没有尝试读取请求正文两次。这行不通。
  • @Peter 我不是。我清除了该方法并尝试了 Cerise Limón 在下面的答案中建议的方法。仍然没有运气:/
  • 您的客户端正在发送不完整的数据(甚至可能什么都没有)。
  • @Peter 请在此处找到请求的屏幕截图:ibb.co/jdwsFb

标签: mongodb go


【解决方案1】:

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

Revel 自动调用 ParseForm、ParseMultipartForm 或请求所需的任何函数,因此 req.Body 被解析并将所有有价值的信息存储到 controller.Params。(Fixed、Route、Query、Form、Files)。

这意味着,在调用你的控制器的方法之前,请求体已经被revel读取了,所以当你再次尝试读取它时,结果将是EOF。来自the docs,而不是使用json.Decoder 和请求正文,请尝试以下操作:

c.Params.BindJSON(&user)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 2021-08-07
    相关资源
    最近更新 更多