Meine Frage ist, wie sollte ich die API für eine Aktion wie "Pause" entwerfen?
Wie würden Sie eine Website entwerfen, die eine Aktion wie "Pause" unterstützt?
Sie würden wahrscheinlich mit einer Zielseite beginnen, die der Client abrufen konnte. Die zurückgegebene Antwort würde wahrscheinlich eine Darstellung des aktuellen Status des Jobs enthalten und Links mit semantischen Annotationen enthalten, die der Benutzer verstehen würde. Eine davon wäre für die "Pause" -Aktion.
Nach der Pause Link könnte ein Formular, mit einer Anzahl von Eingabefeldern, semantische Annotationen für jeden und wahrscheinlich Standardwerte für jedes Feld. Der Client würde einige oder alle Werte in den Eingabefeldern ersetzen und das Formular senden.
Das würde die Formulardaten an den von Ihnen angegebenen Endpunkt senden, und an dieser Stelle würde Ihre Implementierung den Seiteneffekt pause aufrufen und mit einer Repräsentation antworten, die das Ergebnis beschreibt.
Das ist das Modell zu folgen. Die Implementierung Ihrer REST-API ist ein Adapter, der Ihren Service als generische Website erscheinen lässt.
Die Schlüsselidee hier ist, dass der Client nicht im Voraus den zu verwendenden URI oder die zu verwendende http-Methode kennen muss, da diese Informationen in die Darstellungen der vom Server bereitgestellten Links kodiert sind. Der Client muss nur die Links erkennen und folgen.
POST ist fein; HTML-Clients verwenden es seit HTTP/1.0. PUT und PATCH sind auch fein, wenn Sie eine "Remote Authoring" -Schnittstelle bereitstellen möchten.
Sie möchten vielleicht Rest Causistry überprüfen. Stellen Sie sicher, dass Sie durch die Kommentare gehen, wo die wirkliche Diskussion von REST stattfindet. Es ist auch nützlich bewertet Fieldings Paper Tigers and Hidden Dragons ...
Ich sollte auch beachten, dass die oben noch nicht vollständig RESTful ist, zumindest, wie ich den Begriff verwenden. Alles, was ich getan habe, ist die Service-Schnittstellen beschrieben, die nicht mehr als irgendein RPC ist. Um es RESTful zu machen, müsste ich einen Hypertext hinzufügen, um den Dienst einzuführen und zu definieren, beschreiben, wie man das Mapping unter Verwendung von Formularen und/oder Link-Vorlagen durchführt und Code bereitstellt, um die Visualisierungen auf nützliche Weise zu kombinieren.
Matt Timmermans 'Kommentar hat es richtig; Wenn Sie nur eine Reihe von getrennten Endpunkten dokumentieren, die der Client selbstständig navigiert, führen Sie REST nicht aus. Und in Lösungen, in denen Sie nicht zulassen müssen, dass sich die Clients und Server unabhängig entwickeln, ist das auch fein.
REST ist für langlebige netzwerkbasierte Anwendungen gedacht, die mehrere Organisationen umfassen. Wenn Sie die Einschränkungen nicht sehen, verwenden Sie sie nicht.
verfolgen den Kommentar auf:
es scheint, dass diese Art der Navigation-basierte API Organisation ist sehr flexibel, wenn wir von einem menschlichen betrieben Client (wie Browser) sprechen, aber ich bin nicht so sicher, dass es einfach ist, einen automatischen Client zu programmieren, der Änderungen auf der Serverseite anpassen kann. "... fügen Sie einen Hypertext hinzu, um den Service einzuführen und zu definieren, beschreiben Sie, wie Sie das Mapping mithilfe von Formularen und/oder Link-Templates durchführen ..." klingt für mich zu menschlich orientiert.
Ich hatte auch Probleme damit.
Niemand behauptet, dass mit einer REST-API die Maschinenverbraucher magisch in der Lage sein werden, semantische Änderungen in der API zu verstehen. Wenn wir bestehende Clients unterstützen wollen, müssen die Änderungen, die wir auf dem Server vornehmen, rückwärtskompatibel durchgeführt werden. ABER - und das ist die Schlüsselidee - gibt es eine zusätzliche Ebene der Indirektion zwischen der Semantik und der Repräsentation.
Um ein einfaches Beispiel zu wählen, muss der Verbraucher in einer API mit Paginierung die Semantik von next page
verstehen; Es muss in der Lage sein, den Client nach einem Handle für den nächsten Seitenlink zu fragen. Aber es muss nichts darüber wissen, wie diese Verknüpfung dargestellt wird, oder die Link-Mechanismen oder die URI oder etwas Ähnliches. Der generische Browser Analog weiß diese Bits, und das alles funktioniert für den Verbraucher.
Es gibt immer noch ein Protokoll, das der Verbraucher verstehen muss; aber dieses Protokoll wird in Links ausgedrückt, nicht in URI.
Die Antwort auf die Frage, die Sie gestellt haben, ist nicht wirklich wichtig ... aber wenn die Antwort von GET/api/jobs/2 Ihnen keine Antwort gibt, dann ist es nicht REST. Es tut mir leid, Roy Fielding auf dich zu bekommen, aber wenn es dir nicht wirklich wichtig ist, ob es REST ist oder nicht, dann tu einfach, was deinen Anforderungen entspricht. –