我无法在狂欢的框架中获得贴身

时间:2017-09-03 23:41:11

标签: rest curl go revel

我试图在revel中使用Rest架构实现一个基本的CRUD,但是我无法将以json格式编码的数据发送到端点,我尝试了多种方法来检查身体内容请求,所以现在我有一个“最小的可编辑的例子”:

  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
    
  4. 我的问题; curl调用没有给我一个回显(同样的json {"name": "Revel framework"}),所以我错过了正确使用revel?

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

1 个答案:

答案 0 :(得分:2)

根据source of Revel,当请求内容类型为application/jsontext/json时,请求正文的内容会自动从流中读取并存储到c.Params.JSON类型为[]byte

由于Request.Body是一个只能读取一次的流,因此您无法再次读取它(无论如何,即使Revel不自动读取流,您的代码也无法工作,因为{{使用c.Request.Body)1}}无法正确连接。

Revel具有方便的功能Params.BindJSON,可将c.RenderJSON()转换为golang对象。

以下是示例代码。

c.Params.JSON