Gzip распаковать тело JSON POST в Rails / Passenger / Nginx - PullRequest
0 голосов
/ 13 декабря 2011

В нашем коде Rails есть функция, которая принимает тело JSON POST:

contacts = ActiveSupport::JSON.decode(request.raw_post.gsub("+", ""))

(я знаю, что я могу получить это и из params["_json"], но у нас очень большой (МБ) Тела POST, которые по какой-то причине не помещаются в params["_json"] (и + также выдает ошибки).

Поскольку JSON обычно отправляется с мобильного клиента, для нас важно оптимизировать размер загрузкиМы хотим переключиться на сжатие тела POST.

Однако, независимо от того, что мы делаем, мы получаем ту же ошибку без номера строки:

MultiJson::DecodeError (743: unexpected token at ''):

Мы попробовали:

  gzipped_contacts = Zlib::GzipReader.new(StringIO.new(request.raw_post)).read
  contacts = ActiveSupport::JSON.decode(gzipped_contacts.gsub("+", ""))

Это:

   gzipped_contacts = ActiveSupport::Gzip.decompress(request.raw_post)
   contacts = ActiveSupport::JSON.decode(gzipped_contacts.gsub("+", ""))

И найденное здесь решение: Rails: как разархивировать сжатое тело XML-запроса?

I 'Я почти уверен, что это не происходит на уровне контроллера, потому что я не могу ничего там записать, поэтому это нужно сделать в промежуточном программном обеспечении или на сервере (но я не могу найти ничего для Nginx, которое позволило бы нам сдуть).помощь!

1 Ответ

0 голосов
/ 13 декабря 2011

Хорошо, оказалось, что клиент iPhone отправлял неправильные заголовки.Таким образом, решение для любого, кто сталкивался с этим, состоит в том, чтобы увидеть совет здесь:

Rails: как разархивировать сжатое тело запроса xml?

и убедиться, что вы отправляете КонтентТип: gzip / json.

...