2014-01-05 36 views
2

我正在開發我的第一個Sinatra應用程序,而且我很難從發佈請求中獲取參數。Sinatra的閱讀參數

我使用MINITEST ::規格和我的規格看起來像

payload = File.read("./spec/support/fixtures/payload.json") 
post "/api/v1/verify_payload", { payload: payload }, { "CONTENT_TYPE" => "application/json" } 
last_response.body.must_eql payload 

這是我的路線

namespace '/api/v1' do 
    post '/verify_payload' do 
    MultiJson.load(params[:payload]) 
    end 
end 

因爲last_response.body是空的規範失敗。

我在這裏錯過了什麼嗎?

我也嘗試從verify_payload返回整個params,但也在這種情況下,它返回一個空字符串。

更新

curl -X POST -H "Content-Type: application/json" -d '{"payload":"xyz"}' http://localhost:9292/api/v1/verify_payload 

不會對服務器日誌返回任何東西,沒有錯誤

[2014-01-06 01:16:25] INFO WEBrick::HTTPServer#start: pid=10449 port=9292 
127.0.0.1 - - [06/Jan/2014 01:16:27] "POST /api/v1/verify_payload HTTP/1.1" 200 6 0.0220 

感謝

+0

如果你在應用程序中調用你的帖子正常,一切工作? –

+0

該帖子應該由第三方服務調用。我不打算從UI調用它。 – macsig

+3

當然,但是當你用捲曲調用它時會發生什麼,如預期的那樣工作? –

回答

9

西納特拉只是不分析這些數據,因爲他們是沒有形式參數。

形式參數是這樣的

捲曲-X POST 127.1:4567/-d 「富=酒吧」

相反的PARAMS你可以只使用request.body.read或使用機架的contrib。

機架的contrib

  1. gem install rack-contrib
  2. 安裝它需要它

    需要 '機架'

    需要 '機架/的contrib'

  3. 負載它use Rack::PostBodyContentTypeParser

有了這個,你可以使用params作爲正常的JSON POST數據。是這樣的:

捲曲-X POST -H 「內容類型:應用/ JSON」 -d '{ 「有效載荷」: 「XYZ」}' 127.1:4567/

源這個:Sinatra controller params method coming in empty on JSON post requesthttp://jaywiggins.com/2010/03/using-rack-middleware-to-parse-json/

+0

感謝您的幫助 – macsig

+0

我剛剛更新了答案,如果這是您的正確答案,請不要忘記接受此答案! :) –