Как разобрать json входящего POST-запроса в Rails? - PullRequest
19 голосов
/ 05 декабря 2010

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

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

@var = params[:name_of_the_JSON_fields]

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

У кого-нибудь есть идея?

Ответы [ 5 ]

24 голосов
/ 05 декабря 2010

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

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

Content-type: application/json

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

11 голосов
/ 06 мая 2016

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

Я обнаружил, что вам не нужно анализировать, если у вас есть простая настройка API с форматом по умолчанию, установленным на json, как показано ниже (в config / rout.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()
10 голосов
/ 06 декабря 2010

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

@var = JSON.parse(params[:name_of_the_JSON_fields])
4 голосов
/ 15 января 2014

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

request.body.rewind
body = Yajl::Parser.parse request.body.read.html_safe
2 голосов
/ 18 апреля 2019

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

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

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

json_params = JSON.parse(request.raw_post)
...