如何构建Rails POST方法的邮递员请求

时间:2014-08-30 22:11:56

标签: ruby-on-rails rest postman

无论我如何格式化此请求的原始部分,我都无法避免下面的解析错误。

我有一个带有传递规范的create方法的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

我正在使用Postman尝试POST。无论我尝试什么,我都会收到错误:

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

3 个答案:

答案 0 :(得分:9)

对不起来回答这个问题太晚了,但可能会帮助其他人。

您需要做的只是在您的请求标题中-(在邮递员或任何客户端)添加

Content-Type = 'application/json'

或者,您也可以使用curl(来源)尝试:

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

答案 1 :(得分:7)

喜欢 @Tejas Patel 表示这都是关于标题的。但不是明确地设置它们,你可以:

  1. 在请求创建区域切换到body选项卡。设置raw单选按钮。在较低的文本区域输入您的身体:

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

  2. 然后在严格的下拉列表中选择JSON (application/json)选项,而不是默认的Text选项。这将自动设置所需的标头。就是这样 - 你可以按“发送”按钮。

答案 2 :(得分:6)

单引号(')实际上不是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"
   }
}