Sinatra e os dados JSON

Para simular uma API sobre a qual não tenho controle, escrevi um aplicativo Sinatra simples. Eu fiz isso usando rspec também para fazer as coisas corretamente.

Nas especificações, há uma maneira fácil de enviar solicitações de postagem:

# [ ... ]
it
"should work" do
post
'/action,
foo_hash,

headers

last_response.should be_ok

end

No aplicativo sinatra, você pode pegá-lo:

post '/action' do
logger
.info params.inspect
end

Ok, isso funciona muito bem. Mas foo_hash será enviado como parâmetros simples, traduzidos corretamente nas strings necessárias. Se você deseja enviar dados como JSON (como pode ser feito com curl -d ), aqui está o que você precisa na especificação:

require 'json' # at the top of the file
# [ ... ]

it
"should work" do
post
'/action,
foo_hash.to_json,

headers

last_response.should be_ok

end

E nas rotas:

require 'json'

post
'/action' do
logger
.info JSON.parse(request.body.read.to_s)
end

E se você quiser, pode usar um filtro para fazer isso para todas as ações:

before do
@req_data = JSON.parse(request.body.read.to_s)
end

post
'/action' do
logger
.info @req_data
end

E seus dados estarão disponíveis usando @req_data .

Conclusão

Pode-se esperar esse comportamento de sinatra, se você não souber, pode ser surpreendente. Portanto, aqui está uma maneira de lidar com esses dados json adequadamente.

Sugestões?