Das R in REST steht für Ressource
(Was nicht stimmt, weil es für Repräsentativ steht, aber es ist ein guter Trick, sich an die Bedeutung von Ressourcen in REST zu erinnern).
Über PUT /groups/api/v1/groups/{group id}/status/activate
: Sie sind nicht ein „activate“ zu aktualisieren. Ein "Aktivieren" ist keine Sache, es ist ein Verb. Verben sind niemals gute Ressourcen. Eine Faustregel: Wenn sich die Aktion, ein Verb, in der URL befindet, ist sie wahrscheinlich nicht RESTful .
Was machst du stattdessen? Entweder Sie "hinzufügen", "entfernen" oder "aktualisieren" eine Aktivierung für eine Gruppe, oder wenn Sie es vorziehen: Manipulieren einer "Status" -Ressource für eine Gruppe. Persönlich würde ich "Aktivierungen" verwenden, weil sie weniger mehrdeutig sind als das Konzept "Status": Das Erstellen eines Status ist mehrdeutig, das Erstellen einer Aktivierung nicht.
POST /groups/{group id}/activation
Erstellt eine Aktivierung (oder fordert deren Erstellung an).
PATCH /groups/{group id}/activation
Aktualisiert einige Details einer vorhandenen Aktivierung. Da eine Gruppe nur eine Aktivierung hat, wissen wir, auf welche Aktivierungsressource wir uns beziehen.
PUT /groups/{group id}/activation
Fügt die alte Aktivierung ein oder ersetzt sie. Da eine Gruppe nur eine Aktivierung hat, wissen wir, auf welche Aktivierungsressource wir uns beziehen.
DELETE /groups/{group id}/activation
Bricht die Aktivierung ab oder entfernt sie.
Dieses Muster ist nützlich, wenn die "Aktivierung" einer Gruppe Nebenwirkungen hat, z. B. Zahlungen, gesendete E-Mails usw. Nur POST und PATCH können solche Nebenwirkungen haben. Wenn beispielsweise das Löschen einer Aktivierung beispielsweise Benutzer per E-Mail benachrichtigen muss, ist LÖSCHEN nicht die richtige Wahl. In diesem Fall möchten Sie wahrscheinlich eine Deaktivierungsressource erstellen : POST /groups/{group_id}/deactivation
.
Es ist eine gute Idee, diese Richtlinien zu befolgen, da dieser Standardvertrag Ihren Kunden und allen Proxies und Schichten zwischen dem Kunden und Ihnen klar macht, wann ein erneuter Versuch sicher ist und wann nicht. Angenommen, der Client befindet sich irgendwo mit flockigem WLAN und sein Benutzer klickt auf "Deaktivieren", was Folgendes auslöst DELETE
: Wenn dies fehlschlägt, kann der Client es einfach erneut versuchen, bis er eine 404, 200 oder etwas anderes erhält, das er verarbeiten kann. Wenn es jedoch a auslöst POST to deactivation
, weiß es, dass es nicht erneut versucht werden muss: Der POST impliziert dies.
Jeder Client hat jetzt einen Vertrag, der, wenn er befolgt wird, vor dem Versenden von 42 E-Mails schützt, "Ihre Gruppe wurde deaktiviert", einfach weil seine HTTP-Bibliothek den Anruf an das Backend wiederholt.
Aktualisieren eines einzelnen Attributs: Verwenden Sie PATCH
PATCH /groups/{group id}
Falls Sie ein Attribut aktualisieren möchten. Beispielsweise könnte der "Status" ein Attribut für Gruppen sein, das festgelegt werden kann. Ein Attribut wie "Status" ist oft ein guter Kandidat, um sich auf eine Whitelist von Werten zu beschränken. Beispiele verwenden ein undefiniertes JSON-Schema:
PATCH /groups/{group id} { "attributes": { "status": "active" } }
response: 200 OK
PATCH /groups/{group id} { "attributes": { "status": "deleted" } }
response: 406 Not Acceptable
Ersetzen Sie die Ressource ohne Nebenwirkungen und verwenden Sie PUT.
PUT /groups/{group id}
Falls Sie eine ganze Gruppe ersetzen möchten. Dies bedeutet nicht unbedingt, dass der Server tatsächlich eine neue Gruppe erstellt und die alte Gruppe herauswirft, z. B. können die IDs gleich bleiben. Für die Clients kann PUT jedoch Folgendes bedeuten: Der Client sollte davon ausgehen, dass er basierend auf der Antwort des Servers ein völlig neues Element erhält.
Der Client sollte im Falle einer PUT
Anforderung immer die gesamte Ressource senden und über alle Daten verfügen, die zum Erstellen eines neuen Elements erforderlich sind. In der Regel sind dieselben Daten erforderlich, die für eine POST-Erstellung erforderlich sind.
PUT /groups/{group id} { "attributes": { "status": "active" } }
response: 406 Not Acceptable
PUT /groups/{group id} { "attributes": { "name": .... etc. "status": "active" } }
response: 201 Created or 200 OK, depending on whether we made a new one.
Eine sehr wichtige Anforderung ist, dass sie PUT
idempotent ist: Wenn Sie beim Aktualisieren einer Gruppe (oder beim Ändern einer Aktivierung) Nebenwirkungen benötigen, sollten Sie diese verwenden PATCH
. Wenn das Update beispielsweise zum Versenden einer E-Mail führt, verwenden Sie es nicht PUT
.