Как читать данные POST в запросе стойки - программирование
Подтвердить что ты не робот

Как читать данные POST в запросе стойки

Когда я запускаю команду curl

curl -v -H "Content-type: application/json" -X POST -d '{"name":"abc", "id":"12", "subject":"my subject"}' http://localhost:9292

чтобы отправить запрос POST с данными в мое приложение Rack, мой код выводит {}. Это происходит от puts req.POST() в коде ниже.

Почему он печатает {} вместо данных POST? И как правильно получить доступ к данным POST в приложении Rack?

require 'json'

class Greeter
  def call(env)
    req = Rack::Request.new(env)
    if req.post?
      puts req.POST()
    end
    [200, {"Content-Type" => "application/json"}, [{x:"Hello World!"}.to_json]]
  end
end

run Greeter.new
4b9b3361

Ответ 1

Из чтения документов для POST, похоже, что он дает вам проанализированные данные на основе других типов контента. Если вы хотите обработать "application/json", вам, вероятно, понадобится

JSON.parse( req.body.read )

вместо этого. Чтобы проверить это, попробуйте

puts req.body.read

где у вас есть puts req.POST.


req.body - объект ввода-вывода, а не строка. Смотрите документацию body и просмотрите источник. Вы можете видеть, что это на самом деле то же самое, что и ответ mudasobwa.

Обратите внимание, что другой код в приложении Rack может ожидать, что он прочитает один и тот же ввод-вывод, например парсер пар в Sinatra или Rails. Чтобы убедиться, что они видят одни и те же данные и не получают ошибку, вы можете вызвать req.body.rewind, возможно, до и после прочтения тела запроса в вашем коде. Однако, если вы находитесь в такой ситуации, вы можете вместо этого рассмотреть, имеет ли ваша инфраструктура возможность обрабатывать JSON напрямую через какой-либо параметр на контроллере или запрашивать объявление обработчика содержимого и т.д., Скорее всего, будет возможность обрабатывать такой вид запрос в рамках.

Ответ 3

Вы можете попробовать:

req.params

Надеюсь, это поможет вам.