ruby on rails - Raíles json respuesta con compresión gzip.
ruby-on-rails ruby-on-rails-3 (4)
Tengo una API escrita en rieles que en cada solicitud responde con una respuesta JSON.
La respuesta podría ser enorme, por lo que necesito comprimir la respuesta JSON usando gzip.
¿Se pregunta cómo hacer esto en el controlador de rieles?
He añadido la linea
use Rack::Deflater
en config.ru
¿Debería también estar cambiando algo en la línea que hace JSON?
render :json => response.to_json()
Además, ¿cómo verifico si la respuesta está en formato gzip o no ...?
Hice una solicitud de enrollamiento desde el terminal, solo veo el JSON normal.
En algunos casos, puedes considerar escribir una gran respuesta en un archivo y gzip:
res = {} # huge data hash
json = res.to_json
Zlib::GzipWriter.open(''public/api/huge_data.json.gz'') { |gz| gz.write json }
y actualiza este archivo regularmente
Mi publicación Content Compression with Rack :: Deflater describe un par de formas de integrar Rack :: Deflater. Lo más fácil sería simplemente actualizar config/application.rb
con:
module YourApp
class Application < Rails::Application
config.middleware.use Rack::Deflater
end
end
y comprimirá automáticamente todas las respuestas del controlador con deflate / gzip si el cliente explícitamente dice que pueden manejarlo.
Para que la respuesta esté en formato gzip, no tenemos que cambiar la llamada al método de render
.
Si la solicitud tiene el encabezado Accept-Encoding: gzip
, Rails comprimirá automáticamente la respuesta JSON utilizando gzip.
Si no desea que el usuario envíe una solicitud con un encabezado preestablecido, puede agregar el encabezado a la solicitud manualmente en el controlador antes de representar la respuesta:
request.env[''HTTP_ACCEPT_ENCODING''] = ''gzip''
render :json => response.to_json()
Puedes consultar Curl configurando un encabezado personalizado para obtener una respuesta comprimida.
$ curl -H "Accept-Encoding: gzip, deflate" localhost:3000/posts.json > posts_json.gz
luego, descomprímelo para ver la respuesta real json
$ gzip -d posts_json.gz
$ cat posts_json
Si no funciona. Vuelva a publicar con salida de rake middlewares
de rake middlewares
para ayudarnos a solucionar más problemas.