Rails: как разархивировать сжатое тело XML-запроса? - PullRequest
2 голосов
/ 07 июля 2011

У меня есть сайт rails 3, который получает XML-запросы (включая отправку файлов) из приложения для iphone. Приложение iphone сжимает тело своих xml-запросов, которые поступают на мой контроллер следующим образом (это простой запрос, который просто обновляет пару деталей, а не отправляет файлы):

params = {"\x1F\x8B\b\x00\x00\x00\x00\x00\x00\x035\xCAA\x0E\x83 \x10@\xD1\xD3\xE8\xD20\x02R\x17\xDD4\xBD\x87\x01\x9CZ\"H\x03CHo\xDF\xB2`\xFB\xDFO\xF8\x89\x89\x06\xF9\xA81\x9D/\x1F\xEB\x96IS\xC9\x83|\xDE\xF9\x98\xBA\xE2E\xE9\xBB\xD9X.j\xC2F"=>{"\xE8\xFD\xEF\xE4\x02\xB6\x00\x1C\x18\x13\x1C\xA4\xEC\x82A"=>nil}, "\xDF\x88\xA2\xCEt\xBA}\xAA\xCE{\xA7C\x1E\x04"=>nil, "\x1AN6\x86~gw\xB4\xD7\x00\x82\xE0r\xC1\x9D\x8B\xDB\xAC\xD6uF.\xCCb%\x03\x83\xA0\xD4\x0F~\xA0o\x1F\xAE\x00\x00"=>nil, "action"=>"update", "controller"=>"reports", "id"=>"65", "format"=>"xml"}

Это должно выглядеть примерно так:

params = {"report"=>{"workflow_status"=>"-1", "entry_count"=>"0"}, "auth"=>{"time"=>"1310044269", "email"=>"fake@fakedomainzzz.com", "sig"=>"686062dbc27ef49baa69be77a0ba6362"}, "action"=>"update", "controller"=>"reports", "id"=>"65", "format"=>"xml"}

Обратите внимание, что первый пример НЕ является сжатой версией второго, т. Е. Некоторые значения будут другими, но общая структура должна быть одинаковой (после распаковки).

Может кто-нибудь сказать мне, как я его распаковать? Заархивированные параметры поступают из тела запроса, которое в некоторых случаях также включает файловые данные.

благодарен за любые советы - макс.

1 Ответ

5 голосов
/ 07 июля 2011

Вы можете использовать ответ Ричарда Шнимана :

Mime::Type.register "gzip/json", :gzipjson
config.middleware.delete "ActionDispatch::ParamsParser"
config.middleware.use ActionDispatch::ParamsParser , { Mime::GZIPJSON => Proc.new { |raw_request | data = ActiveSupport::JSON.decode(ActiveSupport::Gzip.decompress(raw_request)); data = {:_json => data} unless data.is_a?(Hash); data.with_indifferent_access }}

Это должно быть в config/environment.rb

...