Sig
Sig

Reputation: 5928

MultiJson::LoadError: 795: unexpected token when trying to parse incoming body request

I'm losing my sanity trying to parse an incoming request on a Sinatra app.

This is my spec

 payload = File.read("./spec/support/fixtures/payload.json")
 post "/api/v1/verify_payload", { :payload => payload }
 last_response.body.must_equal payload

where is simply spec/support/fixtures/payload.json

{"ref":"refs/heads/master"}

My route looks like

post '/verify_payload' do
  params =  MultiJson.load(request.body.read, symbolize_keys: true)
  params[:payload]
end

And running the spec I get the following error:

MultiJson::LoadError: 795: unexpected token at 'payload=%7B%22ref%22%3A%22refs%2Fheads%2Fmaster%22%7D'

I have tried to parse the body request in different ways without luck.

How can I make the request valid JSON?

THANKS

Upvotes: 1

Views: 4001

Answers (2)

fhidalgo
fhidalgo

Reputation: 129

The problem it is that you are passing a ruby hash, that is not well formated, you should pass a json object.

Something like this, should work:

post "/api/v1/verify_payload", { :payload => payload.to_json }

Upvotes: 0

Ari
Ari

Reputation: 2378

If you want to send a JSON-encoded POST body, you have to set the Content-Type header to application/json. With Rack::Test, you should be able to do this:

post "/api/v1/verify_payload", payload, 'CONTENT_TYPE' => 'application/json'

Alternatively:

header 'Content-Type' => 'application/json'
post '/api/v1/verify_payload'

More info here: http://www.sinatrarb.com/testing.html

Upvotes: 1

Related Questions