Как разобрать json входящего запроса POST в Rails?

У меня есть следующая проблема. Веб-служба отправляет запрос JSON POST в мое приложение, и я хочу его проанализировать.

Я думал, что просто могу получить доступ к параметрам с помощью

@var = params[:name_of_the_JSON_fields]

но это не сработает. Я вижу в своих журналах Heroku, что запрос выполнен и что параметры есть, но я просто не могу их хранить.

Есть ли у кого-нибудь идеи?

Ответы

Ответ 1

Когда вы отправляете JSON (или XML), рельсы будут обрабатывать весь синтаксический анализ для вас, но вам нужно включить правильные заголовки.

Включите ваше приложение:

Content-type: application/json

И все будет круто.

Ответ 2

Если вы получаете JSON в хеше params, вы можете преобразовать его самостоятельно:

@var = JSON.parse(params[:name_of_the_JSON_fields])

Ответ 3

Этот ответ может не быть конкретным для этого точного вопроса, но у меня была аналогичная проблема при настройке push-уведомлений AWS SNS. Мне не удалось разобрать или даже просмотреть первоначальный запрос на подписку. Надеюсь, это поможет кому-то еще с подобной проблемой.

Я обнаружил, что вам не нужно анализировать, если у вас есть простая настройка API с установленным по умолчанию форматом json, как показано ниже (в config/routes.rb):

 namespace :api, defaults: {format: :json}  do
    namespace :v1 do
      post "/controller_name" => 'controller_name#create'
      get "/controller_name" => 'controller_name#index'
    end
  end

Важная вещь, которую я обнаружил, заключается в том, что входящий пост-запрос доступен переменной request. Чтобы преобразовать это в читаемый формат JSON, вы можете вызвать следующее:

request.body.read()

Ответ 4

Возможно, слишком поздно, чтобы помочь вам, но, возможно, будущие люди будут здесь проверять:) Возможно, рельсы должны анализировать json для вас, но это никогда не сработало для меня. Я прочитал тело запроса напрямую. Я использую парсер "Yajl" json - это очень быстро. Но регулярный старый "json" тоже будет работать здесь (просто используйте JSON.parse)

request.body.rewind
body = Yajl::Parser.parse request.body.read.html_safe

Ответ 5

В большинстве случаев с описанным симптомом истинный корень проблемы является источником входящего запроса: если он отправляет JSON в ваше приложение, он должен отправлять заголовок Content-Type application/json.

Если вы можете изменить приложение, отправляющее запрос, отрегулируйте этот заголовок, и Rails будет анализировать тело как JSON, и все будет работать так, как ожидается.

Когда это невозможно (например, когда вы не контролируете источник запроса - как в случае получения уведомления Amazon SNS), Rails не будет автоматически анализировать тело как JSON, поэтому лучшее, что вы можете сделать, это прочитать и разбери сам, как в:

JSON.parse(request.raw_post)