2010-12-05 132 views
14

我有以下問題。 Web服務正在向我的應用發送JSON POST請求,我想解析它。如何在Rails中解析傳入的POST請求的json?

我以爲我只是可以

@var = params[:name_of_the_JSON_fields] 

訪問PARAMS,但它不工作。我在我的Heroku日誌中看到,請求已完成,參數在那裏,但我無法存儲它們。

有沒有人有想法?

回答

21

當你發佈JSON(或XML)時,rails會爲你處理所有的解析,但你需要包含正確的頭文件。

讓你的應用程序包括:

Content-type: application/json 

而且都將是很酷。

+0

對不起,我不理解它。你能更具體一點嗎?我不想發佈JSON。 Web服務通過POST請求訪問我的應用程序,我只想從該請求獲取數據,然後解析它。 – thomas8877 2010-12-05 19:16:55

+0

@ thomas8877它沒有被解析,因爲Web服務沒有使用正確的內容類型。如果你不能使用「application/json」,那麼你必須將另一個內容類型與json關聯起來,這樣Rails纔會明白它需要解析它。 – 2010-12-06 00:34:14

9

如果您在params哈希表接收JSON,你可以自己進行轉換:

@var = JSON.parse(params[:name_of_the_JSON_fields]) 
4

可能爲時已晚,以幫助你,但也許將來人們會檢測:)也許Rails是應該解析的JSON你,但這從來沒有爲我工作。我直接閱讀請求主體。我使用'Yajl'json解析器 - 它非常快速。但是普通的舊「JSON」將在這裏工作過(只需使用JSON.parse)

request.body.rewind 
body = Yajl::Parser.parse request.body.read.html_safe 
7

這個答案可能不是特別就這個問題詢問,但建立AWS SNS推送通知時,我也有類似的問題。我無法解析甚至查看初始訂閱請求。希望這可以幫助有類似問題的其他人。

我發現你並不需要解析,如果你有設置爲JSON默認格式,類似於一個簡單的API建立以下(在配置/ routes.rb中):

namespace :api, defaults: {format: :json} do 
    namespace :v1 do 
     post "/controller_name" => 'controller_name#create' 
     get "/controller_name" => 'controller_name#index' 
    end 
    end 

重要的事情我發現傳入的帖子請求可以通過變量request訪問。爲了將其轉換爲可讀的JSON格式,您可以撥打以下電話:

request.body.read()