2013-05-06 8 views
10

में एचटीएमएल के बजाय जेसन प्राप्त करता है मुझे एक वेब एप्लिकेशन मिला है जहां मैंने उसी संसाधन के JSON और HTML प्रस्तुतियों के लिए एक ही मार्ग का फिर से उपयोग किया है, चलिए इसे कॉल करें/अब के लिए foo/विवरण। यह पृष्ठ से जुड़ा हुआ है, चलिए इसे/बार/विवरण कहते हैं। (इसलिए, आप देख रहे/बार/विवरण देख रहे हैं ->/foo/विवरण)।बैक बटन (क्रोम) प्ले फ्रेमवर्क

जब मैं पहले पृष्ठ से दूसरे पृष्ठ पर जाता हूं, तो सब ठीक काम करता है। जब मैं क्रोम में बैक बटन पर क्लिक करता हूं, तो मूल पृष्ठ HTML के बजाय JSON के रूप में प्रस्तुत करता है। यदि मैं ब्राउज़र में रीफ्रेश करता हूं, तो मुझे HTML प्रतिनिधित्व मिलता है, न कि JSON।

यहाँ कोड मैं JSON एचटीएमएल बनाम पता लगाने के लिए उपयोग कर रहा हूँ है:

res.result.map { group => 
    render { 
    case Accepts.Html() => Ok(views.html.groups.details(group)) 
    case Accepts.Json() => Ok(Json.toJson(group)) 
    } 
}.getOrElse(NotFound) 

यह इस पद्धति के मानक कार्यान्वयन है और यह हर जगह काम करता है, जब मैं कुछ में क्रोम में वापस बटन का उपयोग को छोड़कर स्थितियों।

क्या कोई मूल्य है जो मैं साफ़ नहीं कर रहा हूं, या कुछ पेज अजाक्स के साथ कर रहे हैं जो उलझन में है, इसे जेसन में प्रस्तुत करने के लिए खेलते हैं, या शायद क्रोम पृष्ठ को कैश कर रहा है लेकिन गलत स्वीकार कर रहा है हेडर स्वीकार करता है ??

मैं दो अलग-अलग मार्गों का उपयोग करके, जेसन के लिए एक और एचटीएमएल के लिए एक के माध्यम से इसे प्राप्त कर सकता हूं, लेकिन मुझे लगता है कि मुझे छोड़ने जैसा लगता है।

किसी के पास कोई विचार है कि इस व्यवहार को केवल बैक बटन में क्या कारण है?

+0

कुछ ब्राउज़र कैश हो सकता है। क्या आपने विभिन्न ब्राउज़रों पर कोशिश की है? –

+0

यह निश्चित रूप से क्रोम का ब्राउज़र कैश है। –

उत्तर

2

यह निश्चित रूप से क्रोम का ब्राउज़र कैश था। यह "स्वीकार करें" -> "एप्लिकेशन/जेसन" के साथ/foo/bar के अनुरोध के बीच और नियमित HTML स्वीकृति हेडर के साथ कोई भेद नहीं करता है। नतीजतन, मैं HTML पृष्ठ लोड करूंगा, उस पृष्ठ पर जावास्क्रिप्ट कच्चे JSON डेटा के लिए एक ही यूआरएल मारा जाएगा, और अगली बार जब मैं वापस हिट करता हूं, तो क्रोम कैश किए गए HTML के बजाय कैश किए गए JSON को सेवा देगा।

नतीजतन, मुझे अपने मार्गों को संशोधित करना पड़ा ताकि मेरा JSON/REST API सभी अलग-अलग यूआरएल के माध्यम से जा सके ताकि क्रोम (और सफारी) जेएसओएन को कैश न करे।

+0

यह सुनिश्चित नहीं है कि यह काम करेगा, लेकिन आप JSON प्रतिक्रिया पर हेडर सेट कर सकते हैं ताकि ब्राउजर को कैश न किया जा सके। यदि आप रुचि रखते हैं तो – estmatic

+0

@estmatic, मेरा जवाब देखें, अगर आप प्रतिक्रिया में "Vary: स्वीकार करें" शीर्षलेख भेजते हैं, तो यह समस्या को ठीक करेगा। – jay

22

केविन आप सही हैं। हालांकि, एक और समाधान है।

यदि आप प्रतिक्रिया शीर्षलेख में "वेरी: स्वीकार करें" जोड़ते हैं, तो यह इस समस्या के साथ क्रोम और अन्य ब्राउज़र (जैसे फ़ायरफ़ॉक्स बनाम 21) जेसन और एचटीएमएल कैश के बीच अंतर करेगा। नोट: वेरी: स्वीकृति-एन्कोडिंग हेडर काम नहीं करता है, जहां तक ​​मैंने परीक्षण किया है।

आप nginx का उपयोग करते हैं, तो आप इस सेट कर सकते हैं: http://wiki.nginx.org/HttpProxyModule#proxy_set_header

proxy_set_header Vary Accept;

हालांकि, वहाँ nginx जहां स्वीकार शीर्षलेख भिन्न हो कभी कभी, कैश के साथ कुछ नहीं भेजा जाएगा के साथ एक मुद्दा है। http://wiki.nginx.org/HttpProxyModule#proxy_set_header देखें इससे निपटने के लिए, आप nginx के लिए gzip_vary चालू कर सकते हैं, लेकिन यह वेरी: स्वीकृति-एन्कोडिंग हेडर भेज देगा। यह हेडर समस्या को हल नहीं करता है।

मैं रेल का उपयोग करें, और मैं एक before_filter मैं कहाँ संशोधित response.headers["Vary"]= "Accept"

मुझे यकीन है कि वहाँ अन्य सर्वर/चौखटे के साथ ऐसा करने का अन्य तरीके हैं रहा हूँ इस्तेमाल किया।

अधिक जानकारी: https://web.archive.org/web/20130114082345/http://blog.sdqali.in/blog/2012/11/27/on-rest-content-type-google-chrome-and-caching/

+0

यह स्वीकार्य उत्तर होना चाहिए, निश्चित रूप से मेरे लिए चाल थी। –

+0

पैट्रिक को जानना अच्छा :) – jay