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

  • 使用revel cli工具创建一个新项目。
  • 应用以下更改
    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
    
  • 执行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

    最佳答案

    根据source of Revel,当请求内容类型为application/jsontext/json时,请求主体的内容将自动从流中读取并存储到类型为[]bytec.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)
    }
    

    关于rest - 我无法在发布框架中发布正文,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46028723/

    10-13 04:24