/ / Link-Header vs. Link-Elemente für RESTful JSON - Json, Webservices, http, rest, http-Header

Link-Header vs. Link-Elemente für RESTful JSON - Json, Web-Services, http, Rest, http-Header

Beim Erstellen einer RESTful- / Hypermedia-API mit JSON-Ressourcen scheint es mir zwei Möglichkeiten zu geben, die Hypermedia-Beziehungen zwischen Ressourcen festzulegen.

  1. Betten Sie die Links in den Hauptteil des JSON-Dokuments ein. Das Problem hier ist, dass es keine standardisierte Syntax für die Angabe von Hyperlinks gibt, obwohl ich einige gute Bemühungen sehe: (HAL, Collection + JSON, JSON-LD, JSON-Schema, um nur einige zu nennen).

  2. Verwenden Sie HTTP-Link-Header. Dies ist standardisiert, daher scheint dies einen Vorteil gegenüber eingebetteten Links zu haben. Die Kunden verstehen nur, wie man den Standardkopf und die Voila sinnvoll versteht. Hypermedia-Güte wird erreicht.

Welcher Weg ist zu gehen und warum?

Antworten:

12 für die Antwort № 1

Gehen Sie zu einem Hypermedia-JSON-Format. Linkheader sind zwar Standard, werden jedoch nur schlecht übernommen. Sie gelten eher für Medienformate, die keine Hypermedien sind. Da Sie jedoch die Wahl haben und ein Hypermedien-Format wählen können (im Gegensatz zu PNG vs. JPG), sollten Sie einfach eines auswählen und vorgehen.

Der gesamte JSON-Standard sprudelt, bis der eine oder andere zu einem De-facto-Standard wird. Je mehr sie verwendet werden, desto mehr werden sie "de facto".

Es scheint mir, dass sich HAL auf einem soliden Standardkurs befindet, und das würde ich wählen.

Aber in jedem Fall, gehen Sie mit einem Hypermedia-Format, weil Sie können.


10 für die Antwort № 2

Wenn Sie möchten, dass Ihre Links von HTTP-Intermediären verarbeitet werden, sollten Sie auf jeden Fall Link-Header verwenden. Ein Beispiel dafür ist die Verknüpfte Cache-Invalidierung:

http://tools.ietf.org/html/draft-nottingham-linked-cache-inv-01

Wenn Sie nur Links zu Ihren Kunden bereitstellen möchten, sollten Sie sie besser in die Entität einfügen, um die Verknüpfungen in verschachtelten Elementen zu nutzen:

{
"item": [
{ "name": "fork",  "href": "http://example.com/item/1" },
{ "name": "spoon", "href": "http://example.com/item/2" },
{ "name": "spork", "href": "http://example.com/item/3" }
],
"href": "http://example.com/items"
}

9 für die Antwort № 3
  • Link-Header können von Intermediären berücksichtigt werden
  • Link-Header werden von SPDY komprimiert
  • Link-Header sind Standard

Sie können bei Bedarf sogar etwas JSON enthalten! http://tools.ietf.org/html/draft-nottingham-link-hint-00

Dieser Ansatz erlaubt die gleichzeitige Zustellung in allen Antworten:

  • Link-Header mit Hypermedien-Informationen
  • eine Nutzlast, die der Ressourcendarstellung gewidmet ist

Natürlich kann die Ressourcendarstellung Links enthalten, die in verschiedenen Formen codiert sind. Die Verwendung von Link-Headern kann jedoch den wichtigsten Teil der dynamischen Struktur Ihrer Site darstellen.

Was diese Lösung definitiv ansprechend macht, ist IMHO der Hinweis "Accept-Post".


5 für die Antwort № 4

Sie können keine Header komprimieren. Wenn Sie viele Links haben, kann dies einen Unterschied machen.

Kontext für einen Link bereitstellen Link-Header haben das Ankerattribut, aber es gibt keine standardisierte Fragmentpfad-Syntax, so YMMV.

Über den Kopf kann ich nicht an andere Vor-und Nachteile denken.


0 für die Antwort № 5

Es scheint mir, beide Alternativen zu verwenden (LinkÜberschriften und Hypermedia-Links im Antworttextkörper, die einem Standardformat (z. B. HAL) folgen, ermöglichen es Ihrer Lösung, die Vorteile beider Ansätze zu nutzen. Das klingt natürlich nach einer guten Idee, wenn Ihr REST-Entwicklungsframework die automatische Erstellung der Links an beiden Stellen unterstützt.