嵌套的RESTful资源

Dón*_*nal 6 rest grails

我正在使用Grails在2.3中引入的REST支持.我的应用包括以下域类:

@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]
}
Run Code Online (Sandbox Code Playgroud)

UrlMappings.groovy我已经定义了以下嵌套的RESTful URL映射:

"/api/sensors"(resources: 'sensor') {
    "/metrics"(resources: "metric")
}
Run Code Online (Sandbox Code Playgroud)

如果我导航到URL,/api/sensors/1/metrics我希望响应显示与ID 1 Metric关联的所有实例Sensor,但实际上它返回所有Metric实例(最多10个)

  • 是否有一个URL只返回Metric与特定Sensor实例关联的实例(不实现我自己的控制器)?
  • 有没有办法覆盖10个结果的默认限制(不向max请求添加参数)?

dma*_*tro 6

看起来并不那么简单.:)如果运行此命令,我们可以得到生动的图片:

grails url-mapping-report
Run Code Online (Sandbox Code Playgroud)

查看

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 |
Run Code Online (Sandbox Code Playgroud)

所以,我们至少需要一个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()
    }
}
Run Code Online (Sandbox Code Playgroud)

以上更改将提供/api/sensors/1/metrics命中时的预期结果(包括对分页结果的限制).