REST-konforme API-Laufzeit-Erkennung / HATEOAS-Client-Design
Für ein SaaS-startup in denen ich involviert bin, Baue ich beide ein RESTful-web-API und ein paar client-apps auf verschiedenen Plattformen, die es verzehren. Ich glaube, ich habe die API herausgefunden, aber jetzt hab ich den Dreh für die Kunden. Wie ich gelesen habe über REST, ich sehe, dass ein wesentlicher Teil der REST ist Entdeckungaber es scheint eine Menge Diskussion zwischen zwei verschiedenen Interpretationen von, was die Entdeckung wirklich bedeutet:
-
Entwickler Entdeckung: Die Entwickler-Festplatte-codes reichliche Mengen von API-Informationen in den client, wie z.B. resource-URI ' s, query-Parameter, unterstützten HTTP-Methoden, und andere details, die Sie entdeckt haben, durch durchsuchen des docs und des Experimentierens mit den API-Antworten. Diese Art der Entdeckung IMHO bedingt cool Verknüpfung und die API-Versionierung Frage, und führt zu harten Kopplung der client-code auf die API. Nicht viel besser ist als bei der Verwendung eine gut dokumentierte Sammlung von RPC ' s, so scheint es.
-
Laufzeit Entdeckung - Die client-app selbst ist in der Lage, um herauszufinden, alles, was er braucht, mit wenig oder gar keine out-of-band-Informationen (vermutlich nur die Kenntnis der Medien-Typen die API behandelt.) Links können heiß sein. Aber um die API sehr effiziente, eine Menge von link-Template für query-Parameter gebraucht zu sein scheint, die macht out-of-band-info zurück kriechen. Es gibt möglicherweise andere Schwierigkeiten, die ich noch nicht gedacht haben, da habe ich nicht bekommen, zu diesem Punkt in der Entwicklung. Aber ich mag die Idee der losen Kopplung.
Laufzeit Entdeckung zu sein scheint, den Heiligen Gral der REST, aber ich sehe herzlich wenig Diskussion darüber, wie die Implementierung einer solchen client. Fast alle ÜBRIGEN Quellen, die ich gefunden habe scheinen anzunehmen Entwickler Entdeckung. Wer kennt einige Runtime discovery-Ressourcen? Best practices? Beispiele oder Bibliotheken mit echtem code? Ich arbeite in PHP (Zend-Framework) für einen client. Objective-C (iOS) für die anderen.
Ist Laufzeit Entdeckung ein realistisches Ziel, angesichts der gegenwärtigen Satz der Werkzeuge und Kenntnisse der Entwickler-community? Ich kann schreiben, meine Kunden zu behandeln, alle URI ' s in eine undurchsichtige Art und Weise, aber, wie dies zu tun, effizient, ist eine Frage, die vor allem über verbindungen mit niedriger Bandbreite. Trotzdem, URI ' s sind nur ein Teil der Gleichung. Was ist mit link-Template in den Laufzeit-Kontext? Wie über die Kommunikation, welche Methoden unterstützt werden, abgesehen davon macht eine Menge von OPTIONEN Anfragen?
InformationsquelleAutor der Frage curtisdf | 2012-02-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
In diesem video Jon Moore baut ein generischer client mit Laufzeit HATEOAS auto-discovery. Es ist ziemlich beeindruckend und es lohnt sich zu beobachten:
http://oredev.org/oredev2010/2010/sessions/hypermedia-apis.html
InformationsquelleAutor der Antwort Ferenc Mihaly
Dies ist definitiv eine harte Nuss zu knacken. Bei Google haben wir umgesetzt, unsere Discovery-Dienst, der alle unsere neuen APIs an. Die TL;DR-version ist, generieren wir ein JSON-Schema-wie spec, dass unsere Kunden analysieren können - viele von Ihnen dynamisch.
Bedeutet, dass die Ergebnisse einfacher SDK upgrades für Entwickler und einfache/bessere Wartung für uns.
Keineswegs die perfekte Lösung, aber viele unserer devs scheinen es zu mögen.
Sehen link für mehr details (und stellen Sie sicher, dass die vid.)
InformationsquelleAutor der Antwort jonathanberi
Faszinierend. Was Sie beschreiben, ist im Grunde das HATEOAS-Prinzip. Was ist HATEOAS Sie Fragen? Lesen Sie diese: http://en.wikipedia.org/wiki/HATEOAS
In juristischer Hinsicht, HATEOAS bedeutet folgenden link. Diese Vorgehensweise entkoppelt den client-spezifischen URL ' s und gibt Ihnen die Flexibilität, ändern Sie Ihr API, ohne zu brechen jeden.
InformationsquelleAutor der Antwort Sam
Haben Sie Ihre Arbeit zu Hause und Sie haben die Herzen der: Laufzeit Entdeckung ist der Heilige Gral. Nicht davon jagen.
UDDI erzählt eine ergreifende Geschichte von runtime discovery: http://en.wikipedia.org/wiki/Universal_Description_Discovery_and_Integration
InformationsquelleAutor der Antwort Yuriy Zubarev
Eine der Voraussetzungen, sollten erfüllt sein, bevor Sie anrufen können Sie einen API 'Erholsam' ist, dass es möglich sein sollte, zu schreiben eine generische client-Anwendung, die auf die API. Mit dem generischen client, der Benutzer sollte in der Lage sein, um Zugriff auf alle API-Funktionen. Ein generischer client ist eine client-Anwendung, die nicht davon ausgehen, dass jede Ressource hat eine bestimmte Struktur über die Struktur, definiert durch die Medien geben. Zum Beispiel, ein web-browser ist eine generische client -, der weiß, wie zu interpretieren, HTML, einschließlich HTML-Formularen etc.
Nehmen wir nun an, wir haben eine HTTP/JSON-API für web-shop und wir bauen wollen, ein HTML - /CSS - /JavaScript-client, der bietet unseren Kunden eine exzellente user experience. Wäre es eine realistische option zu lassen, dass der client eine generic - client-Anwendung? Nein. Wir wollen, um einen spezifischen look-and-feel-für jeden bestimmten Daten-element und jeden bestimmten Zustand der Anwendung. Wollen wir nicht alle wissen über diese Präsentation-Spezifika in der API, im Gegenteil, der Kunde soll definieren, das Aussehen und das Gefühl und die API sollte nur tragen die Daten. Dies bedeutet, dass der client eine hard-codierte Kopplung von spezifischen Ressourcen-Elemente zu bestimmten layouts und user-Interaktionen.
Ist dies das Ende von HATEOAS und damit das Ende der RUHE? Ja und Nein.
Jadenn wenn wir hart-code wissen über die API in den client, verlieren wir den Vorteil, HATEOAS: server-Seite änderungen können brechen client.
Keineaus zwei Gründen:
Wenn Sie daran interessiert sind, praktische Beispiele, Check-out mein JAREST Papier. Der Letzte Abschnitt ist über HATEOAS. Sie werden sehen, dass mit JAREST, auch hochgradig interaktive und visuell attraktiven Kunden ist sehr widerstandsfähig, auf server-Seite ändert, wenn auch nicht 100%.
InformationsquelleAutor der Antwort http://www.admiraalit.nl
Für ein weiteres Beispiel eines basic-runtime discovery client, überprüfen Sie heraus die HAL Reden Hypermedia-API-client-demo.
Basiert auf dem Hypertext Application Language (XML+JSON-schema für die Verknüpfung): http://stateless.co/hal_specification.html
InformationsquelleAutor der Antwort papercowboy
Ich denke, der wichtige Punkt über HATEOAS ist nicht, dass es einige Heilige Gral der client-Seite aber, dass es isoliert den client von URI ändert - es wird angenommen, Sie sind mit den bekannten (oder developr entdeckt custom) Link-Beziehungen, die es ermöglichen das system zu wissen, welche Verknüpfung für ein Objekt ist die editierbare form. Der wichtige Punkt ist die Verwendung einer emdia Typ, der hypermedia-bewusst (z.B. HTML, XHTML, etc).
InformationsquelleAutor der Antwort Falkayn
Schreiben Sie:
Wenn das link-Vorlage in der vorherigen Anfrage, dann gibt es keine out-of-band-Informationen. Zum Beispiel ein HTML-Suchformular nutzt das link-Template (
/search?q=%@
) zum erzeugen einer URL (/search?q=hateoas
), aber nichts ist bekannt durch den client (web-browser), andere als wie Sie HTML-Formulare undGET
.InformationsquelleAutor der Antwort Nicholas Shanks