Relier les relations dans les représentations JSON

Je conçois une API RESTful basée sur des représentations JSON. Afin de respecter HATEOAS, j’utilise largement les liens entre les ressources. Par conséquent, j’ai suivi cette suggestion pour la sérialisation des liens de manière très similaire aux liens ATOM.

Maintenant, j’ai parfois des problèmes pour identifier le type de relation de lien correct. Lorsqu’une ressource contient un lien vers elle-même, la relation de self est évidente. Cela devient plus complexe lorsque les ressources sont des collections et des agrégations de sous-ressources ou contiennent de nombreux liens vers des ressources associées.

Prenez un article de blog comme exemple et pensez à une ressource qui renvoie un instantané de l’article du blog – y compris l’auteur, les tags et les commentaires de cet article. De toute évidence, cette ressource contient de nombreuses sous-ressources et devrait bien entendu fournir des liens distincts:

Exemple de ressource:

 { "blogpost":{ "link":{ "rel":"self", "href":"http://blog/post/4711" }, "author":{ "name":"Bob", "link":{ "rel":"???", "href":"http://author/uri" } }, "title":"foobar", "content":"A long article here…", "comments":[ { "comment":"great article", "link":{ "rel":"???", "href":"http://blog/post/4711/comment/1" }, "author":{ "name":"John Doe", "link":{ "rel":"???", "href":"http://author/uri" } } } ], "tags":[ { "value":"foo", "link":{ "rel":"???", "href":"http://blog/post/4711/tag/foo" } } ] } } 

Alors, quelles sont les relations appropriées pour les liens donnés? Je sais qu’il existe des types de relation tels que tag , mais toutes mes ressources ne correspondent pas aux types de relation existants. Ou est-ce correct d’utiliser selfself en se référant à author / tag / comment, car il se rapporte au contexte du sous-object JSON englobant? À quoi fait référence l’entité sémantique?

La RFC 5988 indique:

Le contexte du lien est soit un IRI de stream, soit un ID d’entrée, en fonction de son emplacement

Comment puis-je interpréter cela en termes de JSON? Chaque nouvel object {…} un nouveau contexte?

Merci!

C’est une excellente question. Si vous regardez l’exemple de Hal, vous verrez que les rels sont définis dans le contexte de la sous-ressource.
Je ne connais aucun guide définitif sur le moment où le rel est lié à la ressource dans son ensemble ou à une sous-ressource contenue.
Le seul élément d’information supplémentaire que je peux vous indiquer est le paramètre d’ancrage dans RFC5988 qui vous permet de redéfinir le contexte IRI en utilisant un fragment ou un URI complètement nouveau.

Idéalement, votre mediatype devrait indiquer si le contexte IRI est différent pour les ressources nestedes ou si le contexte IRI doit être explicitement modifié. Ce serait un autre avantage d’utiliser un type de support tel que application / vnd.hal + json au lieu de l’ancienne application / json, comme l’indique la spécification Hal:

@rel – Pour identifier la relation entre l’URI cible et la «ressource sujet». La ressource sujet est l’élément parent le plus proche.

LSON-LD

Vous pouvez peut-être jeter un coup d’œil à JSON-LD (Notation d’objects JavaScript pour les données liées . Il semble plus compliqué que HAL, mais vous pouvez en faire plus.

JSON-LD est en cours de normalisation au sein du W3C, voici la recommandation de la proposition .

Aussi

  • HAL vs JSON-LD (répondu par Manu Sporny, créateur de JSON-LD)
  • Articles et présentations JSON-LD
  • Hydra ( console )

Désolé je n’ai pas le temps de fournir un exemple ..

Il est un peu tard pour répondre à cette question mais pour référence future, voici comment je résous ce problème:

 { "blogpost":{ "title":"foobar", "content":"A long article here…", "link":{ "rel":"self", "href":"http://blog/post/4711" }, "link":{ "rel": "author", "href": "http://author/uri", "alt":"Bob" }, "link":{ "rel": "comment", "alt": "great article", "href":"http://blog/post/4711/comment/1" }, "link": { "rel":"tag", "href":"http://blog/post/4711/tag/foo", "alt":"foo" } } } 

Lorsque vous y réfléchissez, les commentaires, les balises, etc. sont des ressources distinctes liées à votre message … pourquoi ne pas en faire toutes ce qu’elles sont .. liens! Vous économisez même sur la taille de votre réponse;)