2014-03-26 173 views
5

我正在使用2.3中由Grails引入的REST支持。我的應用程序包括以下領域類:嵌套的RESTful資源

@Resource(formats=['json', 'xml']) 
class Sensor { 
    String name 
    static hasMany = [metrics: Metric] 
} 

@Resource(formats=['json', 'xml']) 
class Metric { 

    String name 
    String value 

    static belongsTo = [sensor: Sensor] 
} 

而在UrlMappings.groovy我已經定義了下面的嵌套REST風格的URL映射:

"/api/sensors"(resources: 'sensor') { 
    "/metrics"(resources: "metric") 
} 

如果我瀏覽到URL /api/sensors/1/metrics我期待的迴應,顯示所有與相關聯的Sensor ID爲1 Metric實例,但事實上它返回所有Metric實例(最多爲10的極限)

  • 是否有URL只返回Metric與特定Sensor實例關聯的實例(無需實現自己的控制器)?
  • 有沒有辦法覆蓋10個結果的默認限制(無需向請求添加max參數)?
+0

關於在使用資源時更改限制,答案是否定的。這裏已經有關於此的討論。這種設計選擇背後的原因是Resource的設計是快速和簡單的,生成和修改控制器作爲下一級定製。我以前對此的回答指向了Grails源代碼,以證明Resource不允許此自定義。 –

+0

http://stackoverflow.com/questions/22336804/change-default-for-max-attribute-on-results-for-resource-on-domain-classes-for/22337550#22337550 –

+0

@JoshuaMoore謝謝,你知道嗎如果有可能爲單個「傳感器」實例獲取「Metric」實例? –

回答

5

看起來並不那麼簡單。 :)如果運行此命令,我們可以得到一個生動的畫面:

grails url-mapping-report 

看到

Controller: metric 
| GET | /api/sensors/${sensorId}/metrics   | Action: index | 
| GET | /api/sensors/${sensorId}/metrics/create | Action: create | 
| POST | /api/sensors/${sensorId}/metrics   | Action: save | 
| GET | /api/sensors/${sensorId}/metrics/${id}  | Action: show | 
| GET | /api/sensors/${sensorId}/metrics/${id}/edit| Action: edit | 
| PUT | /api/sensors/${sensorId}/metrics/${id}  | Action: update | 
| DELETE | /api/sensors/${sensorId}/metrics/${id}  | Action: delete | 

所以,我們至少需要一個MetricController繼承RestfulController並覆蓋index()做其他檢查的Metric和返回列表基於Sensor,如下圖所示:

class MetricController extends RestfulController<Metric> { 
    static responseFormats = ['json', 'xml'] 

    MetricController() { 
     super(Metric) 
    } 

    @Override 
    def index() { 
     def sensorId = params.sensorId 
     respond Metric.where { 
      sensor.id == sensorId 
     }.list() 
    } 
} 

以上改變將提供教人口會d結果(包括對分頁結果的限制)爲/api/sensors/1/metrics

+0

這是最簡單的方式來做到這一點?這不是默認功能._。 –