2017-09-03 5 views
2

restアーキテクチャを使用してrevelで基本CRUDを実装しようとしていますが、jsonフォーマットでエンコードされたデータをエンドポイントに送信できません。リクエストのボディコンテンツをチェックしてください。これで、私は「最小のコンパイル可能なサンプル」を持っています:revel goフレームワークに投稿されたボディを取得できません

  1. revel cliツールを使用して新しいプロジェクトを作成してください。

  2. は以下のものを適用POSTリクエストを行う

    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. を変更します。

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

私の問題を。カールコールは私にエコーバック(同じjson{"name": "Revel framework"})を与えないので、正しくrevelを使うのに欠けているのは何ですか?

PS:私はこの問題の他の関連するリンクを見つけることができますが、私にとってはうまくいきません。例えばこのために:https://github.com/revel/revel/issues/126

答えて

2
要求コンテンツタイプが source of Revelによれば

、いずれかapplication/json又はtext/json、リクエストボディの内容を自動的にストリームから読み出され、[]byte型を持つc.Params.JSONに格納されます。

Request.Bodyは一度しか読み取ることができるストリームであるので、あなたは再びそれを読み取ることができません(とc.Request.Bodyc.RenderJSON()を使用して、正しくserialiazableないのでレヴェルは自動的に、ストリームを読んでいない場合でも、とにかく、あなたのコードは動作しません)。

Revelはc.Params.JSONをgolangオブジェクトに変換するParams.BindJSONという便利な機能を持っています。

ここにサンプルコードがあります。

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

func (c App) Index() revel.Result { 
    data := MyData{} 
    c.Params.BindJSON(&data) 
    return c.RenderJSON(data) 
} 
関連する問題