2013-05-27 10 views
18

के साथ रेल जेसन प्रतिक्रिया है मेरे पास रेल में एक एपीआई लिखा गया है जो प्रत्येक अनुरोध पर JSON प्रतिक्रिया के साथ प्रतिक्रिया करता है।gzip संपीड़न

प्रतिक्रिया बहुत बड़ी हो सकती है, इसलिए मुझे gzip का उपयोग करके JSON प्रतिक्रिया को संपीड़ित करने की आवश्यकता है।

रेल नियंत्रक में ऐसा करने का तरीका आश्चर्य है?

मैं लाइन

जोड़ लिया है
use Rack::Deflater 
config.ru

मैं भी लाइन जो JSON renders में कुछ बदल रहा होना चाहिए में

?

render :json => response.to_json() 

इसके अलावा, मैं कैसे जांचूं कि प्रतिक्रिया gzip प्रारूप में है या नहीं .. ??

मैंने टर्मिनल से एक कर्ल अनुरोध किया, मुझे केवल सामान्य सादा JSON दिखाई देता है।

उत्तर

12

gzip प्रारूप में होने के जवाब के लिए हमें render विधि कॉल को बदलने की आवश्यकता नहीं है।
यदि अनुरोध में हेडर Accept-Encoding: gzip है, तो रेल स्वचालित रूप से gzip का उपयोग कर JSON प्रतिक्रिया को संकुचित कर देगा। ।

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

नीचे @ curiousmind की प्रतिक्रिया की पुष्टि - आप भी 'रैक जोड़ने के लिए :: जेएसओएन प्रतिक्रिया को संपीड़ित करने के लिए रेल प्राप्त करने के लिए डिफ्लेटर 'मिडलवेयर, _even if_ आपने' gzip, deflate 'पर सेट में स्वीकृति-एन्कोडिंग अनुरोध शीर्षलेख पारित किया है। ध्यान दें कि संपीड़न के लिए अनुरोध हेडर भी आवश्यक है। – sameers

4

आप से कर्ल क्वेरी कर सकते हैं:

आप पूर्व निर्धारित हेडर के साथ एक अनुरोध भेजने के लिए उपयोगकर्ता नहीं करना चाहते हैं, तो आप शीर्ष लेख अनुरोध करने के लिए मैन्युअल रूप से नियंत्रक में प्रतिक्रिया प्रतिपादन से पहले जोड़ सकते हैं एक कस्टम हेडर स्थापित करने Gzipped प्रतिक्रिया

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

तो पाने के लिए है, तो वास्तविक प्रतिक्रिया json

$ gzip -d posts_json.gz 
$ cat posts_json 
देखने पर यह संपीड़न हटाने 10

यदि यह काम नहीं करता है। आगे की समस्या निवारण में हमारी सहायता के लिए rake middlewares के आउटपुट के साथ वापस पोस्ट करें।

+3

हेडर के साथ-साथ मुझे फ़ाइल को वास्तव में संपीड़ित करने के लिए ऐप की application.rb फ़ाइल में 'config.middleware.use रैक :: Deflater' भी जोड़ना पड़ा। –

23

मेरी पोस्ट Content Compression with Rack::Deflater रैक :: Deflater को एकीकृत करने के कुछ तरीकों का वर्णन करती है। सबसे आसान बस के साथ config/application.rb अद्यतन करने के लिए होगा:

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

और आप स्वचालित रूप से Deflate/gzip से सभी नियंत्रक प्रतिक्रियाओं सेक जाएगा अगर ग्राहक को स्पष्ट रूप से कहते हैं कि वे इसे संभाल कर सकते हैं।

+0

मुझे इस रैक मिडलवेयर घोषणा के साथ-साथ शीर्षलेखों को एक gzip प्रतिक्रिया प्राप्त करने की आवश्यकता थी। धन्यवाद! –

+0

मैं 'config.middleware.use रैक :: Deflater' application.rb में जोड़ता हूं, संपीड़न केवल मैक ओएस (क्रोम, एफएफ और सफारी) पर काम करना शुरू कर देता है। विंडोज़ पर मुझे 'सामग्री-एन्कोडिंग: gzip;' के बिना प्रतिक्रियाएं मिलती हैं एफएफ और आईई में (केवल क्रोम में काम करता है)। अनुलेख "स्वीकार्य-एन्कोडिंग: gzip" सभी ब्राउज़रों में मौजूद है। क्या आप जानते हैं क्यों?) – bmalets

+0

@bmalets क्या यह अभी भी होता है? इस के आसपास एक रास्ता मिला? –

0

कुछ मामलों में आप एक फ़ाइल में विशाल प्रतिक्रिया लिखने के लिए और इसे gzip पर विचार कर सकते हैं:

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

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

और अद्यतन इस फाइल को नियमित रूप से

संबंधित मुद्दे