2013-05-27 14 views
18

Ho una API scritta in rotaie che su ogni richiesta risponde con una risposta JSON.rotaie risposta json con compressione gzip

La risposta potrebbe essere enorme, quindi ho bisogno di comprimere la risposta JSON utilizzando gzip.

Ti chiedi come farlo nel controller di rotaie?

ho aggiunto la linea

use Rack::Deflater 

in config.ru

Dovrei essere anche cambiando qualcosa nella linea che rende JSON?

render :json => response.to_json() 

Inoltre, come posso controllare se la risposta è in formato gzip o no .. ??

Ho fatto una richiesta di arricciatura dal terminale, vedo solo il normale JSON normale.

risposta

12

Per la risposta in formato gzip, non è necessario modificare la chiamata al metodo render.
Se la richiesta ha l'intestazione Accept-Encoding: gzip, Rails comprimerà automaticamente la risposta JSON utilizzando gzip. .

Se non si desidera che l'utente per inviare una richiesta con l'intestazione preimpostato, è possibile aggiungere l'intestazione alla richiesta manualmente nel controller prima del rendering della risposta:

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

Confermando la risposta di @ curiousmind qui sotto - si deve anche aggiungere il 'Rack :: Il middleware Deflater' per far sì che Rails comprima la risposta JSON, anche se è stata superata l'intestazione della richiesta Accept-Encoding impostata su 'gzip, deflate'. Si noti che l'intestazione della richiesta è necessaria anche per la compressione da avviare. – sameers

4

è possibile interrogare Curl da l'impostazione di un header personalizzato per ottenere risposta gzip

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

poi, poi decomprimerlo per visualizzare l'jSON risposta effettiva

$ gzip -d posts_json.gz 
$ cat posts_json 

Se non funziona. postback con l'output di rake middlewares per aiutarci a risolvere ulteriormente.

+3

Insieme alle intestazioni ho anche dovuto aggiungere "config.middleware.use Rack :: Deflater" al file application.rb dell'applicazione affinché questo comprimesse effettivamente il file. –

23

Il mio post Content Compression with Rack::Deflater descrive un paio di modi per integrare Rack :: Deflater. Il modo più semplice sarebbe quella di aggiornare solo config/application.rb con:

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

e sarete automaticamente comprimere tutte le risposte del controller con sgonfi/gzip se il cliente dice esplicitamente che in grado di gestirlo.

+0

Avevo bisogno di questa dichiarazione del rack Middleware e delle intestazioni per ottenere una risposta gzip. Grazie! –

+0

Aggiungo 'config.middleware.use Rack :: Deflater' a application.rb, la compressione inizia a funzionare solo su Mac OS (Chrome, FF e Safary). Su Windows ricevo le risposte senza 'Content-Encoding: gzip;' in FF e IE (funziona solo in chrome). Post scriptum "Accept-Encoding: gzip" presente in tutti i browser. Sai perché?) – bmalets

+0

@bmalets Questo succede ancora? Trovato un modo per aggirare questo? –

0

In alcuni casi si può considerare di scrivere la risposta enorme in un file e gzip è:

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

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

e aggiornare questo file regolarmente