2012-08-09 6 views
7

वसंत MVC 3.x में मैं एक ContentNegotiatingViewResolver सेम स्वचालित रूप से या तो JSON या XML में किसी भी endpoint रेंडर करने के लिए बस .json या करने के लिए फाइल एक्सटेंशन बदलकर कॉन्फ़िगर कर सकते हैं .xml। मुझे लगता है कि Grails में समकक्ष कार्यक्षमता थी लेकिन मुझे यह नहीं मिल रहा है।Grails 2 - JSON उत्पादन स्वचालित रूप से उत्पादन (स्प्रिंग 3.x की तरह करता है)

सब कुछ मैं पढ़ा है कहते हैं मैं भेजे माइम-प्रकार (withFormat उपयोग करते हुए) को पकड़ने के लिए और उसके बाद JSON मेरी नियंत्रक तरीकों में से हर एक (जैसे rendering JSON with Grails?) में render as JSON (या समतुल्य) का उपयोग कर उत्पादन को निर्दिष्ट किया है। इससे पहले कि मैं अपने नियंत्रकों को जेएसओएन-विशिष्ट कोड जोड़ना शुरू कर दूं, मैंने सोचा कि मैं यहां पूछूंगा ...

तो मेरा सवाल है: क्या मैं केवल '.json' जोड़कर JSON आउटपुट का उत्पादन करने के लिए Grails 2 को कॉन्फ़िगर कर सकता हूं किसी दिए गए यूआरएल के लिए 'फाइल एक्सटेंशन (या स्वीकृति हेडर बदलना)?

+1

यदि आप अभी भी मचान का उपयोग कर रहे हैं, तो आप इसे मचान में जोड़ सकते हैं और यह आपके सभी नियंत्रकों पर लागू होगा। – cdeszaq

उत्तर

7

मैं इसे करने के लिए easly लगता है आप कर सकते हैं का उपयोग कर एक grails filter

यह एक फिल्टर मैं एक खदान आवेदन में अब OAuth एपीआई किया है, इसे स्वीकार हेडर के आधार पर एक्सएमएल, json और yalm कर

class RenderFilters { 

    def grailsApplication 

    def filters = { 

     multiFormat(controller: '*EndPoint', action: '*', search: true) { 

      after = { Map model -> 

       def accepts = request.getHeaders('accept')*.toLowerCase() 

       def out = model.containsKey('out')?model.out:model 

       if(accepts.any{ it.contains('json') }){ 
        render(text: out as JSON, contentType: 'application/json', encoding:"UTF-8") 
       } 

       else if(accepts.any{ it.contains('yaml') }){ 
        render(text: Yaml.dump(out), contentType: 'application/x-yaml;', encoding:"UTF-8") 
       } 

       else if(accepts.any{ it.contains('html') }){ 
        render(text: out as JSON, contentType: 'application/json', encoding:"UTF-8") 
       } 

       else if(accepts.any{ it.contains('xml') }){ 
        render(text: out as XML, contentType: 'application/xml', encoding:"UTF-8") 
       } 

       else { 
        render(text: out as JSON, contentType: 'application/json', encoding:"UTF-8") 
       } 
       false 
      } 

      before = { 

       def contentType = request.getHeader('Content-Type')?.toLowerCase() 

       if(!contentType) return true 

       if(contentType == 'application/json'){ 
        params.body = JSON.parse(request.reader)      
        } 
       if(contentType == 'application/xml'){ 
        params.body = XML.parse(request.reader) 
        } 
       if(contentType == 'application/x-yaml'){ 
        params.body = Yaml.load(request.reader) 
        } 

       params.body = new TypeConvertingMap((Map) params.body)    

       true 
       } 

     } 

    } 
} 
+0

यह जाने का रास्ता दिखता है। मैं इसे सही के रूप में स्वीकार करने से पहले सोमवार को कोशिश करूंगा। मुझे एक JSONP कॉलबैक रैपर जोड़ने की अनुमति देने का भी लाभ है! – nickdos

3

इस SO प्रश्न में आने वाले किसी भी व्यक्ति के लिए, मैंने सोचा कि मैं अपने अंतिम Grails (संस्करण 2.x) फ़िल्टर कोड शामिल करूंगा, क्योंकि यह Fabiano के उत्तर (ऊपर) में से अलग था।

निम्नलिखित फिल्टर की अनुमति देता है सादे HTML सामग्री Grails द्वारा सामान्य रूप से संभाला जा करने के लिए और फ़ाइल एक्सटेंशन द्वारा response.format सेट या शीर्ष लेख स्वीकार करने के लिए Grails सामग्री बातचीत तंत्र का उपयोग करता है (conf सेटिंग के आधार पर: grails.mime.use.accept.header & grails.mime.file.extensions)। मैंने जेएसओएनपी कॉलबैक रैपर के लिए भी समर्थन जोड़ा।

import grails.converters.JSON 
import grails.converters.XML 

class RenderFilters { 

    def filters = { 
     multiFormat(controller: '*', action: '*', find: true) { 
      after = { Map model -> 
       def out = model?.containsKey('out')?model.out:model 

       if (response.format == "json" && params.callback) { 
        render(text: params.callback + "(${out as JSON})" , contentType: 'application/javascript', encoding:"UTF-8") 
        false 
       } else if (response.format == "json") { 
        render(text: out as JSON, contentType: 'application/json', encoding:"UTF-8") 
        false 
       } else if (response.format == "xml") { 
        render(text: out as XML, contentType: 'application/xml', encoding:"UTF-8") 
        false 
       } 
      } 
     } 
    } 
} 
2

दुर्घटना से, मैंने पाया कि नवीनतम grails क्वेरी पर स्वीकृति शीर्षलेख सेट करके स्वचालित रूप से जेएसओएन और एक्सएमएल आउटपुट करता है!

मैं फिलहाल 2.3.2 का उपयोग कर रहा हूं लेकिन शायद पहले के संस्करणों के लिए वही काम करता है और मैंने बस एक नया ऐप बनाया है, कुछ गुणों के साथ एक नया सरल डोमेन क्लास बनाया है, सभी उत्पन्न होते हैं और फिर रन-एप चलाते हैं। इसे चलाने के बाद, कर्ल-ए-एच "स्वीकृति: एप्लिकेशन/जेसन" जेएसओएन और कर्ल-ए-एच "स्वीकार करता है: एप्लिकेशन/एक्सएमएल" बिना किसी अतिरिक्त काम के एक्सएमएल लौटाता है।

मैं तो इस के साथ हैरान था, कि यह सुनिश्चित करने के मैं अपने स्थानीय मशीन पर कुछ अजीब स्थापित नहीं किया है, मैं इसे एक नया सर्वर पर की कोशिश की एक नई grails स्थापना के साथ ... और यह काम करता !!!

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