2012-08-09 4 views
7

Spring MVC 3.x Dosya uzantısını .json olarak değiştirerek JSON veya XML'de herhangi bir bitiş noktasını otomatik olarak oluşturmak için .xml. Grails'de eşdeğer bir işlev olduğunu varsadım ama bulamıyorum. OkuduğumGrails 2 - otomatik olarak JSON çıkışı üretir (Spring 3.x gibi)

her şey (withFormat kullanarak) Gelen mim tipi yakalamak ve daha sonra (örneğin rendering JSON with Grails?) benim denetleyici yöntemlerinin her birinde render as JSON (veya eşdeğeri) kullanarak JSON çıktısı belirtmesi gerektiğini söylüyor. Buraya girmeden önce kontrolörlere JSON'a özgü kod eklemeye başladım. Bu soruyu sormam gerektiğini düşündüm ...

Sorularım: Grails 2'yi otomatik olarak JSON çıktısını kullanarak bir `.json ekleyerek yapılandırabilir miyim? 'herhangi bir URL için dosya uzantısı (veya kabul başlığı değiştiriliyor)?

+1

Hala iskele kullanıyorsanız, onu sadece iskeleye ekleyebilir ve tüm denetleyicilere uygulayabilirsiniz. – cdeszaq

cevap

7

kullanıyorum buna tefriş yapabilirsiniz düşünmek bir grails filter

Bu, bu kabul başlıklarını dayalı xml, json ve yalm yapmak bir mayın uygulamasında ab OAuth API yapmış bir filtredir

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

Bu, gitmenin yolu gibi görünüyor. Doğru olarak kabul etmeden önce Pazartesi günü denemeyi deneyeceğim. Hatta bir JSONP geri arama sarmalayıcısı eklememe izin verme avantajı da var! – nickdos

3

Bu SO sorusuna rastlayan herkes için, son Grails (sürüm 2.x) filtre kodumu eklemem gerektiğini düşündüm, çünkü Fabiano'nun cevabından farklıydı (yukarıda).

Aşağıdaki filtre düz HTML içeriği Grails normal olarak ele alınmasına olanak veren ve dosya uzantısından response.format ayarlamak veya başlığını kabul etmek Grails içerik müzakere mekanizması kullanır (conf ayarlarına bağlı olarak: grails.mime.use.accept.header & grails.mime.file.extensions). Ayrıca bir JSONP geri arama sarmalayıcısı için destek ekledim.

Kazara
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

, ben son grails sadece sorguyu kabul başlığını ayarlayarak otomatik çıkış JSON ve XML olduğunu keşfettik!

Şu anda 2.3.2 kullanıyorum ama muhtemelen önceki sürümler için aynı çalışır ve sadece yeni bir uygulama oluşturdum, bazı özelliklerle yeni bir basit alan sınıfı oluşturdum, hepsi-sonra-çalıştır ve çalıştır-çalıştır. Çalıştırdıktan sonra, curl -i-H "Accept: application/json", JSON'u döndürür ve curl -i -H "Kabul et: application/xml", herhangi bir ek iş olmadan XML'i döndürür.

Bu kadar şaşırdım, yerel makinemde garip bir şey yüklemediğimden emin olmak için yeni bir raptiye montajı ile yepyeni bir sunucuda denedim ... ve işe yarıyor!