我无法在 revel go 框架中发布正文

I cannot get posted body in revel go framework

我正在尝试使用 revel 中的 Rest 架构实现基本的 CRUD,但我无法将以 json 格式编码的数据发送到端点,我尝试了多种方法来检查正文请求中的内容,所以现在我有一个 "minimal compilable example":

  1. 使用 revel cli 工具创建一个新项目。

  2. 应用以下更改

    diff --git a/app/controllers/app.go b/app/controllers/app.go
    index 1e94062..651dbec 100644
    --- a/app/controllers/app.go
    +++ b/app/controllers/app.go
    @@ -9,5 +9,6 @@ type App struct {
     }
    
     func (c App) Index() revel.Result {
    -   return c.Render()
    +   defer c.Request.Body.Close()
    +   return c.RenderJSON(c.Request.Body)
     }
    diff --git a/conf/routes b/conf/routes
    index 35e99fa..5d6d1d6 100644
    --- a/conf/routes
    +++ b/conf/routes
    @@ -7,7 +7,7 @@ module:testrunner
     # module:jobs
    
    
    -GET     /                                       App.Index
    +POST     /                                       App.Index
    
     # Ignore favicon requests
     GET     /favicon.ico                            404
    
  3. 做一个POST请求:

    curl --request POST --header "Content-Type: application/json" --header "Accept: application/json" --data '{"name": "Revel framework"}' http://localhost:9000
    

我的问题; curl 调用没有给我回音(相同的 json {"name": "Revel framework"}),所以我缺少正确使用 revel 的东西?

PS:我可以找到一些与此问题相关的其他链接,但它们对我不起作用。例如:https://github.com/revel/revel/issues/126

根据类型为 []bytesource of Revel, when the request content type is either application/json or text/json, the content of request body is automatically read from stream and stored to c.Params.JSON

由于 Request.Body 是一个只能读取一次的流,您无法再次读取它(无论如何,即使 Revel 不自动读取流,您的代码也不会工作,因为 c.Request.Body 无法使用 c.RenderJSON()).

正确序列化

Revel 有方便的函数 Params.BindJSON,可以将 c.Params.JSON 转换为 golang 对象。

这是示例代码。

type MyData struct {
    Name string `json:"name"`
}

func (c App) Index() revel.Result {
    data := MyData{}
    c.Params.BindJSON(&data)
    return c.RenderJSON(data)
}