50 votes

Relations entre les liens dans les représentations JSON

Je suis en train de concevoir 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 sérialiser les liens d'une 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, le type de relation self est évidente. La situation devient plus complexe lorsque les ressources sont des collections et des agrégations de sous-ressources, ou qu'elles contiennent de nombreux liens vers des ressources connexes.

Prenons l'exemple d'un article de blog et imaginons une ressource qui renvoie un aperçu de l'article de blog - y compris l'auteur, les balises et les commentaires de cet article de blog. Il est évident que cette ressource contient de nombreuses sous-ressources et qu'elle doit fournir des liens distincts vers ces dernières :

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"
            }
         }
      ]
   }
}

Quelles sont donc 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 possible d'utiliser self lorsqu'il se réfère à l'auteur/l'étiquette/le commentaire, parce qu'il se rapporte au contexte du (sous-)objet JSON qui l'entoure ? Quelle est l'entité sémantique self fait référence ?

Le RFC 5988 stipule que

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 ? Chaque nouvel objet est-il {…} un nouveau contexte ?

Merci de votre attention !

15voto

Darrel Miller Points 56797

C'est une excellente question. Si vous regardez l'exemple de Hal vous verrez que les rels sont définies dans le contexte de la sous-ressource.
Je ne connais pas de guide définitif sur la question de savoir si le lien 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 du 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 type de support devrait indiquer si l'IRI de contexte est différent pour les ressources imbriquées, ou si l'IRI de contexte doit être explicitement modifié. Ce serait un autre avantage d'utiliser un type de média comme application/vnd.hal+json au lieu d'une simple application/json comme le stipule la spécification Hal :

@rel - Pour déterminer comment la cible sujet". La ressource sujet est l'élément Resource la plus proche.

8voto

Yves M. Points 1439

LSON-LD

Vous pouvez peut-être jeter un coup d'œil sur JSON-LD (JavaScript Object Notation for 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 .

En outre

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

-7voto

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"
      }
   }
}

Quand on y pense, les commentaires, les tags, etc. sont tous des ressources distinctes liées à votre article ... pourquoi ne pas en faire ce qu'ils sont ... des liens ! Vous économisez même sur la taille de votre réponse ;)

5 votes

Vous avez un double des clés ! La plupart des analyseurs JSON ignorent simplement les clés en double, vous laissant avec un seul des liens. Envisagez plutôt de placer vos liens dans un tableau.

2 votes

Il s'agit d'un très mauvais exemple de conception d'API. Les autres lecteurs sont priés de ne pas le copier !

1 votes

S'il vous plaît, n'utilisez pas cette approche.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X