No matter how I format the raw portion of this request, I cannot avoid the parsing error below.
I have a Rails API with a create method that passes the spec, to illustrate that the controller message is sound:
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
I'm using Postman to try to POST to it. No matter what I try I'm getting the error:
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'
}
Postman request setup:
I've also tried:
{
'power_up': {
'name': 'foo',
'description': 'bar'
}
}
Code from create method and strong parameters declaration in 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
Sorry bit too late to answer this but might help someone else.
All you need to do is -
in your request header (in postman or whatever client) add
Content-Type = 'application/json'
Alternatively, you can also try it with 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
Like @Tejas Patel said it's all about headers. But instead of setting them explicitly you can just:
In the request creation area switch to the body
tab. Set raw
radio button. In the lower text area input your body:
{ "power_up": { "name": "foo", "description": "bar" } }
Then in a dropdown list to the rigth choose JSON (application/json)
option instead of the default Text
option. That will auto-set the required headers. That's it - you can press "Send" button.
Single quotes (') are not actually the legal string delimiter in JSON: a string must be enclosed in double quotes ("). You can get away with it in the browser, since they are string delimiters in javascript. You can easily replicate this in an irb session
JSON.parse(%q[{'foo': 'bar'}]) #=> raises JSON::ParserError
JSON.parse(%q[{"foo": "bar"}]) #=> ok
In addition, given your spec you should be using the second form ie
{
"power_up": {
"name": "foo",
"description": "bar"
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.