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?