Как получить объект JSON с помощью Rack - PullRequest
5 голосов
/ 14 марта 2012

У меня очень простой сервер Ruby Rack, например:

app = Proc.new do |env| 
  req = Rack::Request.new(env).params
  p req.inspect 
  [200, { 'Content-Type' => 'text/plain' }, ['Some body']]
end 

Rack::Handler::Thin.run(app, :Port => 4001, :threaded => true)

Всякий раз, когда я отправляю HTTP-запрос POST на сервер с объектом JSON:

{ "session": {
"accountId": String,
"callId": String,
"from": Object,
"headers": Object,
"id": String,
"initialText": String,
"parameters": Object,
"timestamp": String,
"to": Object,
"userType": String } } 

Я ничего не получаю. Я могу обнаружить полученный запрос, но не могу получить данные. Результаты на моей консоли для puts req.inspect примерно такие:

"{}"

Как я могу получить данные?

Я пытался изменить это что-то вроде:

request  = Rack::Request.new env
object   = JSON.parse request.body
puts JSON.pretty_generate(object)

Но я получаю следующее предупреждение:

!! Unexpected error while processing request: can't convert StringIO into String

Ответы [ 3 ]

5 голосов
/ 12 июня 2012
env['rack.input'].gets

Это сработало для меня. Я обнаружил, что использование curl или wget для проверки POST-запросов к серверу Rack (v1.4.1) требует использования этого кода в качестве запасного варианта для получения тела запроса. У запросов POST в дикой природе (например, GitHub WebHooks) не было такой же проблемы.

4 голосов
/ 15 марта 2012

Кажется, я должен использовать что-то вроде:

msg = JSON.parse env['rack.input'].read 

Тогда просто используйте params в хеше msg.

По крайней мере, у меня это сработалоспособ.

0 голосов
/ 20 декабря 2017

Еще один способ сделать это:

# ...
request  = Rack::Request.new env
object   = JSON.parse request.body.gets
# ...

См. Документацию: www.rubydoc.info / gems / rack / Rack / Lint / InputWrapper

...