Как я могу вернуть сжатые json данные в самом контроллере rails? - PullRequest
0 голосов
/ 29 января 2020

У меня есть API, который возвращает огромные данные, поэтому я хочу сжать эти данные и вернуться к клиенту. Я знаю, что есть способы сделать в Nginx или Rack::deflater in application.rb. Но я хочу сжать эти данные только для этого конкретного ответа API (не хочу делать это в ngnix)

Я пытался, как упоминалось в этом ответе: { ссылка }. Я могу сжать, но не могу ответить клиенту сжатыми данными. Я попробовал это и хочу как-то ответить response_to gz как тип ответа.

Zlib::GzipWriter.open('public/huge_data.gz') { |gz| gz.write data.to_json }
    respond_to do |format|
      format.gz { render gz: {File.read('public/huge_data.gz') } }
    end

Есть ли способ передать эти сжатые данные клиенту или любой другой подход? Заранее спасибо

1 Ответ

0 голосов
/ 29 января 2020

Я не рекомендую это, но если вы действительно хотите сжимать ответ JSON вручную, вот как вы это сделаете:

class CompressedController < ApplicationController
  def test
    respond_to do |f|
      f.json do
        file = Tempfile.new
        json = JSON.generate(hello: 'World')
        Zlib::GzipWriter.open(file.path) { |gz| gz.write json }
        response.set_header('Content-Encoding', 'gzip')
        send_data file.read, type: :json, disposition: 'inline'
      end
    end
  end
end

Это просто самостоятельный минимальный пример. Адаптируйте его к своему фактическому варианту использования.

Если вы действительно хотите решить проблемы с производительностью в здравом уме, используйте сжатие на уровне веб-сервера вместе с кэшированием .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...