Eine REST-konforme Singleton-Ressource

8

Ich komme aus der RPC-Welt, aber ich untersuche derzeit, ob die Verwendung von REST eine gute Idee für mein Projekt ist. Soweit ich von Wikipedia verstehe, besteht die Grundidee von RESTful-Services darin, den Zugriff auf Sammlungen und ihre einzelnen Elemente zu ermöglichen.

In meinem Fall wäre der Server ein Messgerät. Ich muss in der Lage sein, die Messroutine zu starten, zu stoppen und anzuhalten und die Daten jederzeit zu lesen.

Momentan überlege ich Folgendes:

  • POST / measure (startet die Messung, dies wird fortgesetzt, bis der Benutzer sie beendet)
  • PUT / measure pause = true / false (Pause / Pause)
  • LÖSCHEN / Messen (Stopp)
  • GET / measure (Messwerte abrufen)

Ich bin mir jedoch nicht sicher, ob dies dem REST-Modell entspricht, da ich hier nicht wirklich mit Sammlungen oder Elementen arbeite.

Meine Frage: Wie würde ich auf eine Singleton-Ressource zugreifen und die Start / Stopp-Anforderungen an den Server brechen die RESTful statuslose Einschränkung?

    
Sundae 08.12.2011, 16:00
quelle

3 Antworten

1

Du arbeitest immer noch an einer Ressource, und die Art, wie du sie kaputt gemacht hast, klingt gut für mich. Fielding erwähnt ausdrücklich temporäre Dienste im REST-Kapitel :

  

Die Schlüsselabstraktion von Informationen in REST ist eine Ressource. Irgendein   Informationen, die benannt werden können, können eine Ressource sein: ein Dokument oder ein Bild,   ein temporaler Dienst (z. B. "heutiges Wetter in Los Angeles")

Vielleicht wäre es sinnvoll, jeder Messung eine eindeutige ID zu geben. Auf diese Weise können Sie sich eindeutig auf jede Messung beziehen (Sie müssen nicht einmal die alten speichern, aber wenn sich jemand auf eine alte Messung bezieht, können Sie ihnen sagen, dass das, was sie anfordern, nicht mehr aktuell ist).

    
Daff 08.12.2011, 16:13
quelle
7

Nicht REST-konform

Nein, Ihr Ansatz ist nicht REST-konform, denn wenn ich den Arbeitsablauf verstehe, würden Sie die Ressource löschen, um die Messung zu stoppen, und dann die Ressource dazu bringen, das Endergebnis auszulesen. Wenn eine Ressource gelöscht wird, bedeutet dies, dass GET nicht mehr vorhanden ist.

Die Tatsache, dass Ihre Ressource ein Singleton ist, ist überhaupt kein Problem. Das Problem liegt in der Art, wie Sie Verben und Zustand zuordnen.

Ihre Beschreibung ist etwas abstrakt, lassen Sie uns etwas konkreter werden: Nehmen wir an, dass das fragliche Instrument die Winkelgeschwindigkeit eines Schwungrads in Radianten / Sekunde misst. Dieses Instrument hat einige Kosten, die mit der Messung verbunden sind, so dass der Client in der Lage sein muss, die Messung für einige Zeiträume als kostensparende Maßnahme zu deaktivieren. Wenn dies in etwa Ihrem Szenario entspricht, sollte die folgende Beschreibung für Ihr Szenario gelten.

Verben

Sehen wir uns jetzt Ihre Verben an.

GET gibt eine Repräsentation einer Ressource zurück. Also, wenn Sie GET /measure , sollte es einige Daten zurückgeben, die die aktuelle Messung darstellt.

PUT erstellt oder aktualisiert eine bestimmte, benannte Ressource. Die Ressource wird anhand ihrer URL benannt. So bedeutet PUT /measure , dass Sie den Status einer Ressource mit dem Namen /measure aktualisieren oder diese Ressource erstellen, wenn sie nicht bereits vorhanden ist. In Ihrem Fall ist der Wert des Instruments schreibgeschützt: Wir können keinen Wert für Radiant / Sekunde in das Instrument schreiben. Aber der pausierte / aktive Zustand des Instruments ist veränderbar, daher sollte PUT /measure einen Körper enthalten, der den Zustand des Instruments modifiziert. Sie könnten hier viele verschiedene Darstellungen verwenden, aber ein einfacher Ansatz wäre ein Anfragekörper wie active=true oder active=false , um anzugeben, wie der neue Zustand des Instruments aussehen soll.

POST ähnelt PUT , außer dass der Client den Namen der Ressource nicht angibt, die erstellt oder aktualisiert werden soll. In einer anderen API könnte der Client beispielsweise POST /articles verwenden, um einen neuen Artikel zu erstellen. Der Server erstellt eine Ressource und gibt ihr einen Namen wie /articles/1234 . Anschließend wird der Client über diesen neuen Namen informiert, indem ein 201 CREATED HTTP-Code zurückgegeben und ein Location: /articles/1234 -Kopf hinzugefügt wird, um dem Client mitzuteilen, wo sich die neue Ressource befindet . In Ihrem Szenario ist POST kein sinnvolles Verb, da Sie immer wissen, wie der Name Ihrer Singleton-Ressource lautet.

DELETE bedeutet, dass Sie eine Ressource entfernen, und da eine Ressource durch eine URL identifiziert wird, bedeutet DELETE /measure , dass /measure nicht mehr existiert. Ein nachfolgender GET /measure sollte entweder 404 NOT FOUND oder 410 GONE zurückgeben. In Ihrem Fall kann der Client das Instrument nicht wirklich zerstören, daher ist DELETE kein aussagekräftiges Verb.

Fazit

Zusammengefasst wäre ein RESTful-Design für Ihren Dienst also PUT /measure mit einem Anfragetext, der dem Gerät mitteilt, ob es aktiv oder nicht aktiv sein soll (pausiert) und GET /measure , um die aktuelle Messung zu lesen. Wenn Sie GET /measure auf einem angehaltenen Instrument verwenden, sollten Sie wahrscheinlich einen 409 CONFLICT HTTP-Status zurückgeben. Ihr Dienst sollte nicht POST oder DELETE verwenden.

    
Mark E. Haase 26.02.2015 06:25
quelle
1

Aufbauend auf der letzten Antwort. Hier ist, wie Sie es vielleicht brechen möchten

  • measures / - GET alle Maßnahmen aus dem Instrument (Paginate / begrenzen, falls erforderlich basierend auf Abfrageparameter)
  • measures /: measure_id - GET eine bestimmte Kennzahl
  • measures / - POST - Startet eine neue Kennzahl. Dies gibt die neue Kennzahlen-ID zurück, mit der Sie später arbeiten können.
  • measures /: measure_id - DELETE - stoppt die Messung.
  • measures /: measure_id - PUT - Aktualisieren Sie die Kennzahl
  • measures / last_measure - Letzte gemessene Ressource.
Abhinav 08.12.2011 17:21
quelle

Tags und Links