2014-08-30 35 views
8

無論我如何格式化此請求的原始部分,我都無法避免下面的解析錯誤。如何構建郵遞員請求的Rails POST方法

我有與傳遞規範中的一個方法創建一個Rails API,以表明控制器消息是聲音:

describe "POST power_up" do 

    let!(:client) { FactoryGirl.create :client, name: "joe", auth_token: "asdfasdfasdfasdfasdfasdf" } 

    it "should create and save a new Power Up" do 

     expect { post :create, format: :json, power_up: FactoryGirl.attributes_for(:power_up) }.to change(V1::PowerUp, :count).by(1) 
    end 

    end 

我使用郵遞員嘗試發佈它。不管我怎麼努力,我發現了錯誤:

Started POST "/v1/power_ups.json" for 127.0.0.1 at 2014-08-30 18:05:29 -0400 
Error occurred while parsing request parameters. 
Contents: 

{ 
    'name': 'foo', 
    'description': 'bar' 
} 


ActionDispatch::ParamsParser::ParseError (795: unexpected token at '{ 
    'name': 'foo', 
    'description': 'bar' 
} 

郵差請求設置:

screen cap of postman request

我也試過:

{ 
    'power_up': { 
    'name': 'foo', 
    'description': 'bar' 
    } 
} 

代碼從創建方法和強參數申報power_ups_controller.rb

def create 
    @power_up = PowerUp.new(power_up_params) 

    if @power_up.save! 
    redirect_to @power_up 
    end 
end 

private 

    def power_up_params 
    params.require(:power_up).permit(:name, :description) 
    end 

回答

5

單引號(')在JSON中實際上不是合法的string delimiter:字符串必須用雙引號(「)括起來。您可以在瀏覽器中使用它,因爲它們是javascript中的字符串分隔符。您可以在IRB會議

JSON.parse(%q[{'foo': 'bar'}]) #=> raises JSON::ParserError 
JSON.parse(%q[{"foo": "bar"}]) #=> ok 

此外,很容易複製此給你的天賦,你應該使用第二種形式即

{ 
    "power_up": { 
    "name": "foo", 
    "description": "bar" 
    } 
} 
+0

你已經讓我更接近它的出現。但是,我得到以下內容:'ActionController :: ParameterMissing(param丟失或值爲空:power_up):'。我也嘗試刪除封閉的花括號。 – 2014-08-30 23:23:35

+0

這意味着數據與您的控制器設置的強參數要求不匹配。 – 2014-08-30 23:27:50

+0

我已經添加了強大的參數並創建了上面的方法。有一個怪癖,那就是'PowerUp'在模塊「V1」中。 – 2014-08-30 23:44:50

9

對不起有點來不及回答,但可能幫助別人。

所有你需要做的是在你的請求頭-(在郵遞員或任何客戶端)添加

Content-Type = 'application/json'

或者,你也可以捲曲嘗試(來源):

curl -X POST -H "Content-Type: application/json" -d '{"power_up": { "name": "foo", "description": "bar" } }' 127.0.01:3000/v1/power_ups.json

+0

當我使用raw-json body時,我總是忘記添加'Content-Type:application/json' 。如果沒有設置,我的參數不存在(在Rails控制器中)感謝您的答案,這一個讓我很多! – mattLummus 2016-07-13 16:28:57

6

@Tejas Patel表示這是所有關於標題。但是,而不是明確設置它們你可以:

  1. 在請求創建區域切換到body標籤。設置raw單選按鈕。在下面的文字框中輸入你的身體:

    { "power_up": { "name": "foo", "description": "bar" } }

  2. 然後在下拉列表中選擇分辯選項JSON (application/json),而不是默認Text選項。這將自動設置所需的標題。就是這樣 - 你可以按「發送」按鈕。