2014-03-26 11 views
5

Ich verwende die Unterstützung für REST von Grails in 2.3 eingeführt. Meine app enthält die folgenden Domain-Klassen:verschachtelte RESTful-Ressourcen

@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] 
} 

Und in UrlMappings.groovy Ich habe die folgende verschachtelte RESTful URL-Zuordnungen definiert:

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

Wenn ich an die URL navigieren /api/sensors/1/metrics Ich erwarte, dass die Antwort alle zeigen Metric Instanzen mit den Sensor mit ID 1 zugeordnet ist, sondern in der Tat gibt es alle Metric Fälle (bis zu einer Grenze von 10)

  • Gibt es eine URL, die nur Metric Instanzen zurückgibt, die einer bestimmten Sensor Instanz zugeordnet sind (ohne einen eigenen Controller zu implementieren)?
  • Gibt es eine Möglichkeit, die Standardlimit von 10 außer Kraft zu setzen (ohne max Parameter auf die Anfrage hinzufügen)?
+0

In Bezug auf die Änderung der Grenze bei der Verwendung von Ressource ist die Antwort nein. Es gab eine vorherige Diskussion darüber bereits hier. Der Grund für diese Design-Entscheidung war, dass Resource so konzipiert wurde, dass es schnell und einfach ist, die Controller als nächste Stufe der Anpassung zu erzeugen und zu modifizieren. Meine vorherige Antwort darauf hat Zeiger auf die Grails-Quelle, um zu demonstrieren, dass Resource diese Anpassung nicht erlaubt. –

+0

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

+0

@JoshuaMoore Dank, weißt du, Wenn es möglich ist, die "metrischen" Instanzen für eine einzelne "Sensor" -Instanz zu erhalten? –

Antwort

5

Sieht aus wie es nicht so einfach ist. :) Wir können ein lebendiges Bild, wenn dieser Befehl ausgeführt wird:

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 | 

So zu sehen, würden wir mindestens brauchen eine MetricControllerRestfulController erben und überschreiben index() eine zusätzliche Prüfung zu tun für Metric und Listen Rückkehr basierend auf Sensor wie unten dargestellt:

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() 
    } 
} 

Above verändert die expecte bieten würde d Ergebnis (einschließlich der Beschränkung der paginierten Ergebnisse) für /api/sensors/1/metrics bei Treffer.

+0

Und das ist das Mindeste, die ausführliche Art und Weise, dies zu tun ? Wie ist das nicht Standardfunktionalität ._. –