1

I am making AJAX request from the client to Sinatra but somehow the data doesn't show up.Chrome request headers tab suggests that on the client side is everything OK:

Request Payload 
{ test: Data }

However, on Sinatra's side

  post '/api/check/:name' do
    sleep 3
    puts params.inspect
  end

And the console:

 127.0.0.1 - - [03/Feb/2014 10:45:53] "POST /api/check/name HTTP/1.1" 200 17 3.0019
    {"splat"=>[], "captures"=>["name"], "name"=>"name"}

Post data is nowhere to be found, what's wrong ?

Zed
  • 5,683
  • 11
  • 49
  • 81
  • Could you provide more details of the client (code of lines that build and make the request would be good). If that payload is rendered as-is, then it doesn't look like any standard format (e.g. JSON). Which data format are you trying to use, how are you setting the headers, and how are you telling Sinatra to support the incoming format? – Neil Slater Feb 03 '14 at 09:57

1 Answers1

4

It's a common fault. Sinatra just parse form data (source).

To fix this use rack-contrib or the request.body.

Form parameter would look like this

curl -X POST 127.1:4567/ -d "foo=bar"

Instead of params you can just use request.body.read or use rack contrib.

rack-contrib

  1. Install it with gem install rack-contrib
  2. Require it

    require 'rack'

    require 'rack/contrib'

  3. Load it use Rack::PostBodyContentTypeParser

With this you can use params as normal for json post data. Something like this:

curl -X POST -H "Content-Type: application/json" -d '{"payload":"xyz"}' 127.1:4567/

Source for this:

Pierre-Adrien
  • 2,836
  • 29
  • 30
Sir l33tname
  • 4,026
  • 6
  • 38
  • 49