Ich arbeite an einem Unternehmenssystem, das einen REST-fähigen Webdienst zwischen mobilen Clients und einem zentralen Server nutzen wird. So RESTful wie möglich, sagen wir.
Meine Frage bezieht sich auf HATEOAS (Hypermedia als Engine des Anwendungsstatus) und die Verwendung von benutzerdefiniertem XML in HTTP-Antwortkörpern.
Dieses System wird niemals jemals von öffentlichen Clients verwendet werden, aber ich mag die HATEOAS-Idee, das serverseitige Ressourcenzuweisungsmuster später ändern zu können, ohne jeden der Clients unabhängig neu konfigurieren zu müssen. Wenn wir entscheiden, dass wir aufgrund von Skalierungsproblemen die Serverfunktion über mehrere physische Boxen verteilen müssen, wird dies in den URIs reflektiert, die generiert werden, wenn ein Client (oder der Server unter Anweisung eines Clients) eine neue Ressource erstellt .
Unsere Geschäftsdomäne ist sehr spezifisch und ungewöhnlich. Daher möchte ich benutzerdefiniertes XML für HTTP-Response-Entity-Körperschaften im gesamten Web-Service verwenden, und der Client analysiert Ressourcen-URIs aus der XML-Datei, um über Ressourcenstandorte informiert zu bleiben, die beim Ändern des eigenen Anwendungsstatus verwendet werden können. Ich weiß, dass dies den H-Teil von HATEAOS "durchbricht".
z.B. Wenn ein Client eine Transaktion an den Server zur Verarbeitung sendet, kann der Server das folgende xml-Fragment in den HTTP-Antworttextkörper 201 (als Teil eines größeren xml-Dokuments) einschließen. Der Server würde den Client auch über den URI für die neu erstellte Transaktionsressource selbst informieren, aber dies würde wahrscheinlich nur in dem Location HTTP-Header enthalten sein.
%Vor%Ist das so schlecht? Es besteht kaum eine Chance, dass die Clients, die diesen Dienst verwenden, jemals browserbasiert sind. Was sind die anderen Vorteile von Hypermedia gegenüber der Bereitstellung der Uris als einfacher Text in XML?
Ich denke, ich könnte zu XHTML gehen, aber der Parser auf unserer mobilen Plattform ist viel effizienter mit POX.
Was Sie tun, indem Sie eine URL in resulturi zurückgeben, ist bereits Hypermedia. Das einzige Problem besteht darin, dass Sie einen Medientyp benötigen, der dem Client mitteilt, wie die Antwort formatiert ist, so dass die URLs auf vorhersehbare und dokumentierte Weise analysiert werden können.
Option 1: Erstellen Sie Ihren eigenen Medientyp wie vnd.yourcompany.Resource + xml. Damit erklären Sie, dass der Medientyp von einem XML-Parser analysiert werden kann, aber er folgt einigen speziellen Regeln, die von Ihrem Unternehmen definiert werden. An dieser Stelle können Sie den gewünschten Standard für die Definition von Hypermedia-Links verwenden (siehe diese Frage). Ein schöner Vorteil davon ist, dass Sie, wenn Sie innerhalb von 6 Monaten entscheiden, dass Sie eine Änderung am XML-Format vornehmen müssen, eine vnd.yourcompany.ResourceV2 + xml erstellen können und solange Sie schlau genug sind, Header auf Ihren alten Clients, können Sie das neue Format nahtlos an das alte anschliessen, indem Sie neue Client-Anwendungen das neue Format akzeptieren lassen.
Option 2: Ich bin nur halb ernsthaft mit dieser Option, aber ich habe darüber nachgedacht, auf einen neuen Medientyp namens application / hyperxml + xml zu drängen. Das Dokument würde den gleichen Regeln wie application / xml folgen, würde aber auch XLink für Hypermedia verwenden. Dies würde es Leuten ermöglichen, die Javascript verwenden, um das XML-Dokument zu analysieren, um auch Hypermedia auf standardisierte Weise zu nutzen.
Option 3: Verwenden Sie XHtml. Ich verstehe nicht, warum dein Parser Probleme mit Xhtml hat, aber ich nehme dein Wort dafür.
Es gibt zwei wichtige Informationen, die Ihr REST-Server zur Verarbeitung von Anfragen benötigt, unabhängig von der zugrunde liegenden Auszeichnungssprache: ein Medientyp und ein URI. Angenommen, ein Medientyp für einen bestimmten URI würde eine Client-Server-Kopplung einführen. Es würde zum Beispiel verhindern, dass derselbe URI jemals zwei verschiedene Arten von Medientypen bedient.
XML ist nicht die einzige Option beim Entwerfen von Hypermedia-Formaten. Sehen Sie sich die Sun Cloud-API an, die eine REST-API basierend auf JSON (obwohl es scheinbar keinen Medientyp mit seinen Hyperlinks verwendet). Es ist nicht schwer, von diesem Ansatz zu einem zu kommen, der Medientypen mit Hyperlinks kombiniert.
Sie könnten beispielsweise eine JSON-Datenstruktur namens Link definieren, die so aussieht:
%Vor%Hypermedia benötigt weder HTML noch vollständig qualifizierte URIs. Wenn Ihr Medientyp eine Regel definiert, um einige Elemente der Antwort in de-referenzierbare Ressourcen umzuwandeln, dann haben Sie Hypermedia.
%Vor%Das obige Beispiel in Kombination mit einer Medientypregel, wie der Inhalt des Ergebniselements dereferenziert werden soll, ist Hypermedia auf dieselbe Weise wie:
%Vor%enthält eine Regel, mit der der Basis-HTTP-URI vorangestellt wird. So ist das Beispiel unten, wo die Tatsache, dass die HTTP-Zeichenfolge dereferenzierbar ist, implizit gelassen werden kann.
%Vor%Obwohl sie alle Hypermedia sind und diese Einschränkung erfüllen, würde ich dagegen argumentieren, dass Sie Ihre eigenen neuen Regeln und Tags für die Hypermedia-Produktion erstellen sollten, wenn möglich, und nur bestehende verwenden. Das erste Beispiel macht es für den Benutzer weniger offensichtlich, dass dieses Element eine verlinkte Ressource als das letzte Beispiel darstellt.
Ich würde vorschlagen, dass Sie diese Hyperlinks nicht manuell codieren, sondern ein Tool verwenden, das diese Hyperlinks für Sie erstellt. Interaktionen orientierte Programmierung ist eine gute Methode, um diese Interaktionen (Hyperlinks) zu erstellen. Bitte folgen Sie diesem Link diese Technologie für uns Ссылка
Auf ein Minimum (auch wenn Sie nichts anderes tun) sollten Sie Ihre URL in XLink
XML-Prozessoren können diese als URIs nativ analysieren und verfolgen. Als allgemeine Regel gilt, dass Text, der nicht übersetzbar ist oder niemals Unterelemente enthalten könnte, in einem Attribut enthalten sein sollte, um solche Einschränkungen durchzusetzen.
Aber darüber hinaus tun, was andere vorgeschlagen haben und definieren Sie Ihren Medientyp, damit die Bedeutung von den Kunden verstanden werden kann.
Tags und Links xml rest web-services hateoas