10

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

我有一个带有通过规范的 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 尝试向其发送邮件。无论我尝试什么,我都会收到错误消息:

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'
}

邮递员请求设置:

邮递员请求的屏幕截图

我也试过:

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

来自 create 方法和强参数声明的代码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
4

3 回答 3

13

抱歉回答这个问题有点晚了,但可能会对其他人有所帮助。

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

Content-Type = 'application/json'

或者,您也可以使用 curl (source) 进行尝试:

curl -X POST -H "Content-Type: application/json" -d '{"power_up": {
    "name": "foo",
    "description": "bar"
   }
}' 127.0.01:3000/v1/power_ups.json
于 2016-01-31T06:28:15.893 回答
9

就像@Tejas Patel所说的那样,这都是关于标题的。但是,您可以不明确地设置它们:

1.- 在请求创建区域切换到body选项卡。设置raw单选按钮。在下方文本区域输入您的正文:

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

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

于 2017-01-26T12:49:49.473 回答
7

单引号 (') 实际上不是 JSON 中的合法字符串分隔符:字符串必须用双引号 (") 括起来。您可以在浏览器中避开它,因为它们是 javascript 中的字符串分隔符。您可以轻松复制在 irb 会话中

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

此外,鉴于您的规格,您应该使用第二种形式,即

{
  "power_up": {
    "name": "foo",
    "description": "bar"
   }
}
于 2014-08-30T22:34:17.407 回答