Ответ rails json с сжатием gzip - программирование
Подтвердить что ты не робот

Ответ rails json с сжатием gzip

У меня есть api, написанный в rails, который по каждому запросу отвечает с ответом JSON.

Ответ может быть огромным, поэтому мне нужно сжать ответ JSON с помощью gzip.

Интересно, как это сделать в контроллере rails?

Я добавил строку

use Rack::Deflater

в config.ru

Должен ли я также что-то менять в строке, которая отображает JSON?

render :json => response.to_json()

Также, как проверить, является ли ответ в формате gzip или нет???

Я сделал запрос на завивание с терминала, я вижу только обычный обычный JSON.

4b9b3361

Ответ 1

Для ответа в формате gzip нам не нужно менять вызов метода render.
Если запрос имеет заголовок Accept-Encoding: gzip, Rails автоматически сжимает ответ JSON с помощью gzip.

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

request.env['HTTP_ACCEPT_ENCODING'] = 'gzip'
render :json => response.to_json()

Ответ 2

Мой пост Сжатие содержимого с помощью Rack:: Deflater описывает несколько способов интеграции Rack:: Deflater. Самый простой способ - просто обновить config/application.rb с помощью

module YourApp
  class Application < Rails::Application
    config.middleware.use Rack::Deflater
  end
end

и вы автоматически сжимаете все ответы контроллера с помощью deflate/gzip, если клиент явно говорит, что может обрабатывать его.

Ответ 3

Вы можете запросить Curl, установив собственный заголовок, чтобы получить ответ gzipped

$ curl -H "Accept-Encoding: gzip, deflate" localhost:3000/posts.json > posts_json.gz

затем, затем распакуйте его, чтобы просмотреть фактический ответ json

 $ gzip -d posts_json.gz
 $ cat posts_json

Если это не работает. назад назад с выходом rake middlewares, чтобы помочь нам в устранении неполадок.

Ответ 4

В некоторых случаях вы можете рассмотреть возможность записи огромного ответа в файл и gzip:

res = {} # huge data hash
json = res.to_json

Zlib::GzipWriter.open('public/api/huge_data.json.gz') { |gz| gz.write json }

и регулярно обновлять этот файл