无论我如何格式化此请求的原始部分,我都无法避免下面的解析错误。
我有一个带有传递规范的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'
}
邮递员请求设置:
我也试过了:
{
'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
答案 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 表示这都是关于标题的。但不是明确地设置它们,你可以:
在请求创建区域切换到body
选项卡。设置raw
单选按钮。在较低的文本区域输入您的身体:
{
"power_up": {
"name": "foo",
"description": "bar"
}
}
然后在严格的下拉列表中选择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"
}
}