Ein Kanarienvogel in einer Kohlenmine.
Ich habe seit fast einem Jahr auf eine solche Frage gewartet. Es war unvermeidlich, dass dieser Tag kommen würde, und ich bin sicher, dass wir in den kommenden Monaten noch viele weitere Fragen wie diese sehen werden.
Die Warnschilder
Sie haben absolut Recht, das Erstellen von RESTful-Clients dauert länger als das Erstellen von SOAP-Clients. Die SOAP-Toolkits entfernen viel Code und stellen Client-Proxy-Objekte fast mühelos zur Verfügung. Mit einem Tool wie Visual Studio und einer Server-URL kann ich in weniger als fünf Minuten lokal auf Remote-Objekte beliebiger Komplexität zugreifen.
Dienste, die application / xml und application / json zurückgeben, sind für Cliententwickler so ärgerlich. Was sollen wir mit diesem Datenklumpen machen?
Glücklicherweise bieten viele Websites, die REST-Services bereitstellen, auch eine Reihe von Client-Bibliotheken, sodass wir diese Bibliotheken verwenden können, um Zugriff auf eine Reihe stark typisierter Objekte zu erhalten. Scheint irgendwie dumm zu sein. Wenn sie SOAP verwendet hätten, hätten wir diese Proxy-Klassen selbst mit Code generieren können.
Seifenkopf, ha. Es ist die Latenz, die tötet. Wenn die Leute wirklich besorgt sind über die Anzahl der überschüssigen Bytes, die über das Kabel gehen, ist HTTP möglicherweise nicht die richtige Wahl. Haben Sie gesehen, wie viele Bytes vom User-Agent-Header verwendet werden?
Ja, haben Sie jemals versucht, einen Webbrowser als Debugging-Tool für etwas anderes als HTML und Javascript zu verwenden? Vertrau mir, es ist scheiße. Sie können nur zwei der Verben verwenden, das Caching stört ständig, die Fehlerbehandlung verschluckt so viele Informationen, dass ständig nach einem gottverdammten favicon.ico gesucht wird. Erschieß mich einfach.
Lesbare URL. Nur Substantive, keine Verben. Ja, das ist einfach, solange wir nur CRUD-Operationen ausführen und nur auf eine Weise auf eine Hierarchie von Objekten zugreifen müssen. Leider benötigen die meisten Anwendungen etwas mehr Funktionalität.
Die bevorstehende Katastrophe
Derzeit gibt es eine große Anzahl von Entwicklern, die Anwendungen entwickeln, die in REST-Services integriert sind und dabei sind, zu denselben Schlussfolgerungen zu gelangen, die Sie haben. Ihnen wurde Einfachheit, Flexibilität, Skalierbarkeit, Evolvabilität und der heilige Gral der zufälligen Wiederverwendung versprochen. Die Eigenschaften des Webs selbst, wie kann etwas schief gehen.
Sie stellen jedoch fest, dass die Versionierung genauso problematisch ist, aber der Compiler hilft nicht, Probleme zu erkennen. Der handgeschriebene Client-Code ist schwierig zu pflegen, wenn sich die Datenstrukturen weiterentwickeln und URLs überarbeitet werden. Das Entwerfen von APIs nur für Substantive und vier Verben kann sehr schwierig sein, insbesondere wenn RESTful Url-Fanatiker Ihnen mitteilen, wann Sie Abfragezeichenfolgen verwenden können und wann nicht.
Entwickler werden sich fragen, warum wir unsere Anstrengungen für die Unterstützung von Json- und XML-Formaten verschwenden. Warum konzentrieren wir uns nicht einfach auf eines und machen es gut?
Wie ist es so schief gegangen?
Ich werde dir sagen, was schief gelaufen ist. Wir als Entwickler lassen die Marketingabteilungen unsere Hauptschwäche ausnutzen. Unsere ewige Suche nach der Silberkugel machte uns blind für die Realität dessen, was REST wirklich ist. An der Oberfläche scheint REST so einfach und unkompliziert zu sein. Benennen Sie Ihre Ressourcen mit Urls und verwenden Sie GET, PUT, POST und DELETE. Zur Hölle, wir Entwickler wissen bereits, wie das geht. Wir beschäftigen uns seit Jahren mit Datenbanken mit Tabellen und Spalten und SQL-Anweisungen mit SELECT, INSERT, UPDATE und DELETE. Es hätte ein Kinderspiel sein sollen.
Es gibt andere Teile von REST, die einige Leute diskutieren, wie die Selbstbeschreibung und die Hypermedia-Einschränkung, aber diese Einschränkungen sind nicht so einfach wie die Ressourcenidentifikation und die einheitliche Schnittstelle. Das scheint die Komplexität zu erhöhen, wenn das gewünschte Ziel die Einfachheit ist.
Diese verwässerte Version von REST wurde in vielerlei Hinsicht in der Entwicklerkultur validiert. Es wurden Server-Frameworks erstellt, die die Ressourcenidentifizierung und die einheitliche Benutzeroberfläche fördern, die anderen Einschränkungen jedoch nicht unterstützen. Die Begriffe schwebten herum und unterschieden die Ansätze (HI-REST gegen LO-REST, Corporate REST gegen Academic REST, REST gegen RESTful).
Ein paar Leute schreien, dass es nicht REST ist, wenn Sie nicht alle Einschränkungen anwenden. Sie werden die Vorteile nicht erhalten. Es gibt keine halbe Ruhe. Aber diese Stimmen wurden als religiöse Eiferer bezeichnet, die sich darüber aufregten, dass ihre kostbare Bezeichnung aus der Dunkelheit gestohlen und zum Mainstream gemacht worden war. Eifersüchtige Menschen, die versuchen, REST schwieriger klingen zu lassen als es ist.
Der Begriff REST ist definitiv zum Mainstream geworden. Fast jede wichtige Web-Eigenschaft, die eine API hat, unterstützt "REST". Twitter und Netflix sind zwei sehr bekannte. Die beängstigende Sache ist, dass ich nur an eine öffentliche API denken kann, die selbstbeschreibend ist, und es gibt eine Handvoll, die die Hypermedia-Einschränkung wirklich implementieren. Sicher, einige Websites wie StackOverflow und Gowalla unterstützen Links in ihren Antworten, aber es gibt große Lücken in ihren Links. Die StackOverflow-API hat keine Stammseite. Stellen Sie sich vor, wie erfolgreich die Website gewesen wäre, wenn es keine Homepage für die Website gegeben hätte!
Sie wurden irregeführt, fürchte ich
Wenn Sie es bis hierher geschafft haben, lautet die kurze Antwort auf Ihre Frage, dass diese APIs (Netflix und Twitter) nicht allen Einschränkungen entsprechen und Sie daher nicht die Vorteile erhalten, die REST-APIs bieten sollen.
Die Erstellung von REST-Clients dauert länger als bei SOAP-Clients, sie sind jedoch nicht an einen bestimmten Service gebunden. Sie sollten sie daher dienstübergreifend wiederverwenden können. Nehmen Sie das klassische Beispiel eines Webbrowsers. Auf wie viele Dienste kann ein Webbrowser zugreifen? Was ist mit einem Feed Reader? Auf wie viele verschiedene Dienste kann der durchschnittliche Twitter-Client zugreifen? Ja, nur eine.
REST-Clients sollten nicht für die Schnittstelle mit einem einzelnen Dienst erstellt werden, sondern für die Verarbeitung bestimmter Medientypen, die von jedem Dienst bereitgestellt werden können. Die offensichtliche Frage dazu ist, wie Sie einen REST-Client für einen Dienst erstellen können, der application / json oder application / xml bereitstellt. Das kannst du nicht. Dies liegt daran, dass diese Formate für einen REST-Client völlig nutzlos sind. Du hast es selbst gesagt,
Sie müssen "raten", was über die Pipe zurückkommt, da es kein echtes Schema oder Referenzdokument gibt
Sie sind absolut korrekt für Dienste wie Twitter. Die selbstbeschreibende Einschränkung in REST besagt jedoch, dass der HTTP-Inhaltstyp-Header genau den Inhalt beschreiben sollte, der über die Leitung übertragen wird. Wenn Sie application / json und application / xml bereitstellen, erfahren Sie nichts über den Inhalt.
Wenn es um die Leistung von REST-basierten Systemen geht, muss das Gesamtbild betrachtet werden. Das Sprechen über Hüllkurvenbytes ist wie das Abwickeln von Schleifen, wenn eine schnelle Sortierung mit einer Shell-Sortierung verglichen wird. Es gibt Szenarien, in denen SOAP eine bessere Leistung erbringen kann, und es gibt Szenarien, in denen REST eine bessere Leistung erbringen kann. Der Kontext ist alles.
REST gewinnt einen großen Teil seines Leistungsvorteils, indem es sehr flexibel in Bezug auf die unterstützten Medientypen ist und eine ausgefeilte Unterstützung für das Caching bietet. Damit das Caching gut funktioniert, müssen jedoch fast alle Einschränkungen eingehalten werden.
Ihr letzter Punkt über lesbare URLs ist bei weitem der ironischste. Wenn Sie sich wirklich zur Hypermedia-Einschränkung verpflichten, könnte jede URL eine GUID sein und der Client-Entwickler würde nichts an Lesbarkeit verlieren.
Die Tatsache, dass URIs für den Client undurchsichtig sein sollten, ist eines der wichtigsten Dinge bei der Entwicklung von REST-Systemen. Lesbare URLs sind für den Serverentwickler praktisch und gut strukturierte URLs erleichtern dem Server-Framework das Versenden von Anforderungen. Dies sind jedoch Implementierungsdetails, die keinen Einfluss auf die Entwickler haben sollten, die die API verwenden.
Die Twitter-API ist nicht annähernd REST-fähig, weshalb Sie keinen Nutzen aus der Verwendung über SOAP ziehen können. Die Netflix-API ist viel näher, aber die Verwendung generischer Medientypen zeigt, dass die Nichteinhaltung einer einzigen Einschränkung einen tiefgreifenden Einfluss auf die Vorteile des Dienstes haben kann.
Es kann nicht alles ihre Schuld sein
Ich habe eine Menge Dumping auf die Dienstleister gemacht, aber es braucht zwei, um RESTfully zu tanzen. Ein Dienst kann allen Einschränkungen religiös folgen und ein Kunde kann dennoch alle Vorteile leicht rückgängig machen.
Wenn ein Client URLs fest codiert, um auf bestimmte Arten von Ressourcen zuzugreifen, verhindert dies, dass der Server diese URLs ändert. Jede Art von URL-Konstruktion, die auf implizitem Wissen darüber basiert, wie der Dienst seine URLs strukturiert, ist eine Verletzung.
Annahmen darüber, welche Art von Darstellung von einem Link zurückgegeben wird, können zu Problemen führen. Wenn Sie Annahmen über den Inhalt der Darstellung treffen, die auf Wissen basieren, das nicht explizit in den HTTP-Headern angegeben ist, wird dies definitiv zu einer Kopplung führen, die in Zukunft Schmerzen verursachen wird.
Sollten sie SOAP verwendet haben?
Persönlich denke ich nicht. REST richtig gemacht ermöglicht es einem verteilten System, sich langfristig weiterzuentwickeln. Wenn Sie verteilte Systeme mit Komponenten erstellen, die von verschiedenen Personen entwickelt wurden und viele Jahre halten müssen, ist REST eine ziemlich gute Option.