2015-10-07 13 views
5

Ich habe diese Frage, die eine Weile durch meinen Kopf gegangen ist. Nehmen wir an, wir haben unser Projekt mit Backend und Frontend auf separaten Ebenen strukturiert. Also, vom Frontend, wollen wir einen Kunden erhalten, die auf hal+json Format kommt:Wie sollte Hateoas vom Frontend aus gehandhabt werden?

GET /customers/1 HTTP/1.1 
Accept: application/hal+json 
{ 
    "name": "Alice", 
    "links": [ { 
     "rel": "self", 
     "href": "http://localhost:8080/customer/1" 
    } { 
     "rel": "transactions", 
     "href": "http://localhost:8080/customer/1/transactions" 
    }] 
} 

Dann vom Frontend ich alle Kundentransaktionen erhalten möge. Meine Frage ist: Wie soll ich die URL bekommen? sollte es von der Antwort sein? oder sollte ich es intern bauen?

Wenn wir mit der ersten Option gehen, denke ich, dass das vielleicht nicht elegant wäre, alle Links zu iterieren, bis wir das bekommen, was wir wollen. Auch könnte die Situation eintreten, in der wir nicht den Link der Anfrage haben, die wir machen wollen.

Wenn wir mit der zweiten Option gehen, ich verstehe nicht, wie diese URL zu bauen, wenn wir nicht tatsächlich die IDs haben. Wie kann ich neue Kundentransaktionen erstellen, wenn hadoas IDs durch Links ersetzt und ich die Objektreferenz nicht mehr im Körper habe?

Ich dachte, dass vielleicht Service sowohl application/hal+json (orientiert an Benutzer) und application/json (orientiert an Kunden) unterstützen sollte, aber ich sehe nicht, dass dies ist, wie es im Allgemeinen getan wird.

Was denkst du?

Antwort

3

Definitiv die erste Option. Da nämlich HATEOAS eine letzte Stufe der Richardson Maturity Model ist, sind Kunden erwartet, dass die bereitgestellten Links zu folgen, nicht die URLs von ihnen selbst zu bauen:

Der Punkt hypermediatic Kontrollen ist, dass sie uns sagen, was wir als nächstes tun können und der URI der Ressource, die wir manipulieren müssen, um dies zu tun. Anstatt uns wissen zu müssen, wo wir unsere Terminanfrage aufgeben müssen, geben uns die Hypermedia-Steuerelemente in der Antwort an, , wie es geht.

Welche Vorteile bringt das? Ich kann zumindest zwei denken:

  • Einfaches Upgrade des REST-API - serverseitige Entwickler die URIs der Ressourcen ändern können, ohne dass der clientseitigen Code zu brechen, weil Kunden nur die zur Verfügung gestellten Links folgen; Darüber hinaus können serverseitige Entwickler problemlos neue Links hinzufügen
  • Robustheit - durch das Folgen der Links würde clientseitiger Code niemals versuchen, auf die fehlerhaften Links, falsch geschriebenen Links usw. zuzugreifen.

Q: Auch könnte es die Situation geschehen, wo wir was wir tun wollen, nicht die Verbindung des Antrags müssen?

Es ist Aufgabe des API-Designers sicherzustellen, dass alle erforderlichen Links bereitgestellt werden. Front-End-Entwickler sollten sich darum keine Gedanken machen. auch

Siehe:

+0

Was im Falle ich die Benutzer-ID haben, die ich möchte eine Behörde hinzufügen? Dann müsste ich eine GET-Anfrage an/users stellen, um den Link der angegebenen Benutzer-Berechtigungen zu erhalten. Das wäre in Ordnung? Ich mache 2 Anfragen statt einer. Vielen Dank für Ihre Antwort! – jscherman

+2

Sie sollten keine ID von einem externen System haben. Du solltest eine URL haben. Und ja, es sind 2 Anfragen ... es sei denn, der Server ist schlau genug, um Ihre Absicht zu kennen. dann könnte es zum Beispiel die Transaktionsbeziehung für Sie einbetten. Eine Möglichkeit, diese Absicht zu geben, besteht darin, den konsumierenden Client mit einer Kopfzeile zu identifizieren. Aber ärgern Sie sich nicht über die 2 Anfragen, es ist ein sehr kleiner Preis zu zahlen. JETZT wenn du intern bist ... warum benutzt du sowieso eine HTTP API? gehen Sie einfach zum DB/System oder nehmen Sie die Daten auf, die Sie benötigen. –

+0

Ich denke, ich habe Ihren Standpunkt verstanden. Vielen Dank! – jscherman

1

HATEOAS (Hypermedia als Engine of Application State) ist eine Einschränkung der REST-Anwendungsarchitektur. Sie können einen Blick auf Frühling HATEOAS Dokumentation zum Beispiel haben:

https://spring.io/understanding/HATEOAS

Eine andere Verbindung, um es mit Spring und AngularJS verfügbar ist hier:

AngularJS and Spring HATEOAS tutorial

Dieses gut genug zu sein scheint und behandelt Ihren Anwendungsfall.

Grüße, André

Verwandte Themen