2012-08-09 30 views
7

Trong Spring MVC 3.x tôi có thể cấu hình một bean ContentNegotiatingViewResolver để tự động hiển thị bất kỳ điểm cuối nào trong JSON hoặc XML đơn giản bằng cách thay đổi đuôi tệp thành .json hoặc .xml. Tôi cho rằng có một chức năng tương đương trong Grails nhưng tôi không thể tìm thấy nó.Grails 2 - tự động tạo ra đầu ra JSON (như Spring 3.x)

Tất cả những gì tôi đã đọc cho biết tôi phải bắt đến mime-type (sử dụng withFormat) và sau đó xác định đầu ra JSON sử dụng render as JSON (hoặc tương đương) trong mỗi một trong những phương pháp điều khiển của tôi (ví dụ rendering JSON with Grails?). Trước khi tôi đi sâu vào và bắt đầu thêm mã JSON cụ thể vào bộ điều khiển của tôi, tôi nghĩ rằng tôi muốn hỏi ở đây ...

Vì vậy, câu hỏi của tôi là: Tôi có thể cấu hình Grails 2 để tự động tạo ra đầu ra JSON hay không bằng cách thêm `.json 'mở rộng tệp (hoặc thay đổi tiêu đề chấp nhận) cho bất kỳ URL đã cho nào?

+1

Nếu bạn vẫn đang sử dụng giàn giáo, bạn có thể thêm nó vào giàn giáo và nó sẽ áp dụng cho tất cả các bộ điều khiển của bạn. – cdeszaq

Trả lời

7

Tôi nghĩ rằng bạn có thể easly để nó sử dụng một grails filter

Đây là một bộ lọc Tôi đã làm ab OAuth API trong một ứng dụng của tôi, nó làm xml, json và yalm dựa trên chấp nhận tiêu đề

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

Điều này giống như cách để đi. Tôi sẽ thử vào thứ hai trước khi chấp nhận là chính xác. Nó thậm chí còn có lợi thế là cho phép tôi thêm một wrapper gọi lại JSONP! – nickdos

3

Đối với bất cứ ai đi qua câu hỏi SO này, tôi nghĩ rằng tôi muốn bao gồm Grails (phiên bản 2.x) mã bộ lọc cuối cùng của tôi, vì nó đã khác với câu trả lời của Fabiano (ở trên).

bộ lọc sau cho phép nội dung HTML đơn giản để được xử lý như bình thường bằng Grails và sử dụng Grails cơ chế đàm phán nội dung để thiết lập response.format bằng cách mở rộng tập tin hoặc chấp nhận tiêu đề (tùy thuộc vào các thiết lập conf: grails.mime.use.accept.header & grails.mime.file.extensions). Tôi cũng đã thêm hỗ trợ cho trình bao bọc gọi lại JSONP.

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

Tình cờ, tôi phát hiện ra rằng Grails mới nhất tự động xuất JS và XML bằng cách đặt tiêu đề Chấp nhận trên truy vấn!

Tôi đang sử dụng 2.3.2 tại thời điểm này nhưng có thể là các công trình tương tự cho các phiên bản trước và tôi đã tạo ứng dụng mới, tạo một lớp miền đơn giản mới với một số thuộc tính, chạy tạo tất cả và sau đó chạy ứng dụng. Sau khi chạy nó, curl -i -H "Accept: application/json" trả về JSON và curl -i -H "Accept: application/xml" trả về XML mà không cần bất kỳ công việc bổ sung nào.

Tôi đã rất ngạc nhiên với điều này, để đảm bảo rằng tôi chưa cài đặt một cái gì đó lạ trên máy cục bộ của mình, tôi đã thử nó trên một máy chủ hoàn toàn mới với cài đặt grails mới ... và nó hoạt động !!!

Các vấn đề liên quan