web-dev-qa-db-fra.com

Relier les relations dans les représentations JSON

Je conçois une API RESTful basée sur des représentations JSON. Afin de me conformer à HATEOAS, j'utilise beaucoup de liens entre les ressources. Par conséquent, j'ai suivi cette suggestion pour sérialiser les liens d'une manière très similaire à ATOM links.

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 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 de blog - y compris l'auteur, les balises et les commentaires de cet article de blog. Évidemment, cette ressource contient de nombreuses sous-ressources et devrait bien sûr également fournir des liens séparés vers celles-ci:

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 relations tels que tag, mais toutes mes ressources ne correspondent pas aux types de relations existants. Ou est-il correct d'utiliser self en se référant à l'auteur/à la balise/au commentaire, car cela se rapporte au contexte du (sous-) objet JSON englobant? À quoi fait référence l'entité sémantique self?

RFC 5988 stipule:

Le contexte du lien est soit un IRI de flux, soit un ID d'entrée, selon l'endroit où il apparaît

Comment puis-je interpréter cela en termes de JSON? Est-ce que chaque nouvel objet {…} un nouveau contexte?

Merci!

48
b_erb

C'est une excellente question. Si vous regardez l'exemple pour 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.
La seule information supplémentaire que je puisse vous indiquer est le paramètre d'ancrage de la RFC5988 qui vous permet de redéfinir l'IRI de contexte en utilisant soit un fragment, soit un URI complètement nouveau.

Idéalement, votre mediatype devrait indiquer si l'IRI de contexte est différente pour les ressources imbriquées ou si l'IRI de contexte doit être explicitement modifiée. Ce serait un autre avantage d'utiliser un type de média tel que application/vnd.hal + json au lieu de l'ancien application/json comme l'indique la spécification Hal:

@rel - Pour identifier la relation entre l'URI cible et la "ressource sujet". La ressource de sujet est l'élément de ressource parent le plus proche.

13
Darrel Miller

LSON-LD

Vous pouvez peut-être jeter un œil à JSON-LD (Notation d'objet JavaScript pour données liées . Cela semble plus compliqué que HAL mais vous pouvez en faire plus.

JSON-LD est en cours de standardisation à l'intérieur du W3C, voici la recommandation de la proposition .

Aussi

Désolé, je n'ai pas le temps de donner un exemple.

8
Yves M.