Ein RESTful-Service hat also einen festen Satz von Verben im Wortschatz. Ein RESTful-Webdienst entnimmt diese den HTTP-Methoden. Es gibt einige vermeintliche Vorteile, ein festes Vokabular zu definieren, aber ich verstehe den Punkt nicht wirklich. Vielleicht kann es jemand erklären.
Warum ist ein festes Vokabular nach REST besser als die dynamische Definition eines Vokabulars für jeden Staat? Objektorientierte Programmierung ist beispielsweise ein beliebtes Paradigma. Es wird beschrieben, dass RPC feste Schnittstellen definiert, aber ich weiß nicht, warum Leute annehmen, dass RPC durch diese Einschränkungen eingeschränkt ist. Wir könnten die Schnittstelle dynamisch spezifizieren, so wie ein RESTful-Service dynamisch seine Inhaltsstruktur beschreibt.
REST soll dahingehend vorteilhaft sein, dass es wachsen kann, ohne den Wortschatz zu erweitern. RESTful-Services wachsen dynamisch, indem Sie mehr Ressourcen hinzufügen. Was ist so falsch daran, einen Service durch dynamische Angabe eines objektspezifischen Vokabulars zu erweitern? Warum verwenden wir nicht einfach die Methoden, die für unsere Objekte definiert sind, als Vokabular und lassen unsere Dienste dem Kunden beschreiben, was diese Methoden sind und ob sie Nebenwirkungen haben oder nicht?
Grundsätzlich habe ich das Gefühl, dass die Beschreibung einer serverseitigen Ressourcenstruktur der Definition eines Vokabulars entspricht, wir dann aber gezwungen sind, das begrenzte Vokabular zu verwenden, um mit diesen Ressourcen zu interagieren.
Entkoppelt ein festes Vokabular wirklich die Anliegen des Clients von den Anliegen des Servers? Ich muss mich sicherlich um eine Konfiguration des Servers kümmern, dies ist normalerweise die Ressourcenposition in RESTful-Diensten. Sich über die Verwendung eines dynamischen Vokabulars zu beschweren, erscheint unfair, da wir dynamisch überlegen müssen, wie wir diese Konfiguration irgendwie verstehen können. Ein RESTful-Service beschreibt die Übergänge, die Sie durchführen können, indem Sie die Objektstruktur über Hypermedia identifizieren.
Ich verstehe einfach nicht, was ein festes Vokabular besser macht als ein selbstbeschreibendes dynamisches Vokabular, das in einem RPC-ähnlichen Dienst sehr gut funktionieren könnte. Ist dies nur eine schlechte Begründung für das einschränkende Vokabular des HTTP-Protokolls?
Betrachtung
Nur um meine Gedanken ein wenig klarer zu machen als ich es getan habe. Angenommen, Sie entwerfen eine Allzweck-API, möglicherweise nicht einmal mit Blick auf das Web. Würden Sie sich freuen, wenn jemand sagt, dass Sie diese Methodennamen nur für Ihre Objekte verwenden können? REST ist nicht auf HTTP beschränkt, sondern berücksichtigt die Situation, in der jede von Ihnen geschriebene, dem Web zugewandte oder anderweitig einfach aus Objekten bestehende API die Methoden GET POST PUT und DELETE enthält. Daher ist diese object.foo-Methode, die Sie definieren wollten, nicht möglich. Sie müssen ein neues Objekt namens foo definieren und dessen GET-Methode aufrufen. Genau so funktioniert REST, und es ist mir ein wenig unangenehm, darüber nachzudenken. Sie haben kein besseres allgemeines Verständnis für die Funktionsweise von foo. Sie mussten lediglich ein neues Objekt für eine Methode erstellen, die im Wesentlichen für ein übergeordnetes Objekt gilt. Darüber hinaus ist Ihre API nicht weniger komplex, Sie haben gerade die Komplexität der Benutzeroberfläche durch das Erstellen weiterer Objekte verborgen. RESTful-Webservices zwingen uns, eine Schnittstelle zu verwenden, die im Kontext der von uns bereitgestellten API ausreicht oder nicht. Vielleicht gibt es einen guten Grund, dies mit Web-konformen APIs zu tun, aber einen guten Grund, nicht für jedes Objekt in jeder Allzweck-API Standardschnittstellen zu verwenden. Ein praktisches Beispiel wäre wünschenswert.