Ответ 1
Когда вы отправляете JSON (или XML), рельсы будут обрабатывать весь синтаксический анализ для вас, но вам нужно включить правильные заголовки.
Включите ваше приложение:
Content-type: application/json
И все будет круто.
У меня есть следующая проблема. Веб-служба отправляет запрос JSON POST в мое приложение, и я хочу его проанализировать.
Я думал, что просто могу получить доступ к параметрам с помощью
@var = params[:name_of_the_JSON_fields]
но это не сработает. Я вижу в своих журналах Heroku, что запрос выполнен и что параметры есть, но я просто не могу их хранить.
Есть ли у кого-нибудь идеи?
Когда вы отправляете JSON (или XML), рельсы будут обрабатывать весь синтаксический анализ для вас, но вам нужно включить правильные заголовки.
Включите ваше приложение:
Content-type: application/json
И все будет круто.
Если вы получаете JSON в хеше params, вы можете преобразовать его самостоятельно:
@var = JSON.parse(params[:name_of_the_JSON_fields])
Этот ответ может не быть конкретным для этого точного вопроса, но у меня была аналогичная проблема при настройке 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()
Возможно, слишком поздно, чтобы помочь вам, но, возможно, будущие люди будут здесь проверять:) Возможно, рельсы должны анализировать json для вас, но это никогда не сработало для меня. Я прочитал тело запроса напрямую. Я использую парсер "Yajl" json - это очень быстро. Но регулярный старый "json" тоже будет работать здесь (просто используйте JSON.parse)
request.body.rewind
body = Yajl::Parser.parse request.body.read.html_safe
В большинстве случаев с описанным симптомом истинный корень проблемы является источником входящего запроса: если он отправляет JSON в ваше приложение, он должен отправлять заголовок Content-Type application/json
.
Если вы можете изменить приложение, отправляющее запрос, отрегулируйте этот заголовок, и Rails будет анализировать тело как JSON, и все будет работать так, как ожидается.
Когда это невозможно (например, когда вы не контролируете источник запроса - как в случае получения уведомления Amazon SNS), Rails не будет автоматически анализировать тело как JSON, поэтому лучшее, что вы можете сделать, это прочитать и разбери сам, как в:
JSON.parse(request.raw_post)