web-dev-qa-db-fra.com

Comment dois-je gérer les liens et les références HATEOAS dans JSON?

Je suis en train de concevoir une api REST et d'être aussi RESTful que possible. Je veux incorporer HATEOAS = dans les réponses json.

L'ajout d'URL aux ressources connexes est assez facile, mais il y a eu une discussion sur la structure à utiliser pour ces liens.

BEAUCOUP d'articles que j'ai trouvés utilisent une structure empruntée à ATOME alimente:

"links": [ 
    {"rel": "self", "href":"http://example.org/entity/1"},
    {"rel": "friends", "href":"http://example.org/entity/1/friends"}, ... 
]

Cela a soulevé certaines questions:

  • Pourquoi utiliser un tableau comme conteneur? Selon un développeur javascript que je connais, l'accès aux liens serait plus facile avec les liens comme propriétés d'un objet. Par exemple:

    "self":    { "href":"http://example.org/entity/1" }, /* (facebook uses this) */  
    "friends": { "href":"http://example.org/entity/1/friends", "type": "..."}
    
  • Existe-t-il une structure json commune (en plus d'adapter atom again) pour décrire des références dans les propriétés des ressources? (par exemple l'expéditeur d'un message).

    La référence devrait probablement être résolue à nouveau en tant qu'URL, mais serait-il mauvais d'inclure également l'ID simple? un peu comme:

    "sender": { 
        "id": 12345,
        "href": "resource-uri"
    }
    

Ma façon de penser est que même si HATEOAS fait en sorte qu'un client n'a pas besoin de beaucoup de connaissances pour utiliser une API, je suis un peu réticent à supprimer la possibilité d'utiliser ces connaissances (comme accéder à la photo de profil en créant le lien côté client sans rechercher d'abord l'utilisateur).

34
Laures

J'ai redémarré ce sujet sur le groupe Google API-Craft et j'ai obtenu d'excellentes réponses.

Les principaux avantages de la conception de la baie sont:

  • plusieurs liens pour la même relation
  • plusieurs relations pour le même lien sans écrire le lien aggain
  • la possibilité de commander les liens

La carte de cause a une meilleure accessibilité.

En ce qui concerne la structure, il existe de nombreuses possibilités:

Je suppose que j'irai avec HAL car c'est la solution la plus propre, le reste a l'air un peu ... étrange pour json.

26
Laures

En ce qui concerne la structure, vous pouvez essayer de regarder HAL ( http://stateless.co/hal_specification.html ) ou JSON-LD: ( http: // json-ld. org / )

4
Andrew Robertson

Je pense que c'est pour que vous puissiez proposer plusieurs liens basés sur la méthode http.

par exemple.

"links": [ 
    {"rel": "sender", "method":"post", "href":"http://example.org/entity/1"},
    {"rel": "sender", "method":"put", "href":"http://example.org/entity/1"}, ... 
]

vous pourriez peut-être l'adapter à votre idée

"sender": { 
     "href":"http://example.org/entity/1",
     "methods": ["put","post"]
}
1
chris31389