what ventajas specifically results restful from for enable does apis json rest hateoas

json - specifically - ventajas de hateoas



Relaciones de enlace en las representaciones JSON (3)

Estoy diseñando una API RESTful basada en representaciones JSON. Para cumplir con HATEOAS, utilizo enlaces entre recursos extensamente. Por lo tanto, seguí esta sugerencia para serializar enlaces de forma muy similar a los enlaces de ATOM.

Ahora a veces tengo problemas para identificar el tipo correcto de relación de enlace. Cuando un recurso contiene un enlace a sí mismo, la self relación es obvia. Se vuelve más complejo cuando los recursos son colecciones y agregaciones de sub-recursos, o contienen muchos enlaces a recursos relacionados.

Tome una publicación de blog como ejemplo y piense en un recurso que arroje una instantánea de la publicación del blog, incluido el autor, las etiquetas y los comentarios de esta publicación de blog. Obviamente, este recurso contiene muchos subrecursos y, por supuesto, también debe proporcionar enlaces separados para ellos:

Recurso de muestra:

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

Entonces, ¿cuáles son las relaciones apropiadas para los enlaces dados? Sé que hay tipos de relación como tag , pero no todos mis recursos coinciden con los tipos de relación existentes. ¿O está bien usar self al referirse al autor / etiqueta / comentario, ya que se relaciona con el contexto del JSON (sub-) objeto adjunto? ¿A qué se refiere la entidad semántica?

RFC 5988 declara:

El contexto del enlace es un IRI de alimentación o una identificación de entrada, según dónde aparezca

¿Cómo puedo interpretar esto en términos de JSON? ¿Cada nuevo objeto {…} un nuevo contexto?

¡Gracias!



Es un poco tarde para responder esa pregunta, pero para referencia futura, así es como resuelvo este problema:

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

Cuando lo piensas, los comentarios, las etiquetas, etc. son recursos distintos vinculados a tu publicación ... ¿por qué no hacer que sean lo que son ... enlaces? Usted incluso ahorra en el tamaño de su respuesta;)


Esa es una buena pregunta. Si miras el ejemplo de Hal , verás que los rills se definen dentro del contexto del sub-recurso.
No conozco ninguna guía definitiva sobre cuándo el rel está relacionado con el recurso como un todo o un subconjunto contenido.
La única información adicional a la que puedo apuntar es el parámetro de anclaje en RFC5988 que le permite redefinir el IRI de contexto utilizando un fragmento o un URI completamente nuevo.

Idealmente, su tipo de medio de comunicación debería indicar si el IRI de contexto es diferente para los recursos anidados, o si el IRI de contexto debe cambiarse explícitamente. Esa sería otra ventaja de usar un tipo de medio como application / vnd.hal + json en lugar de la antigua aplicación / json simple como lo indica la especificación de Hal:

@rel: para identificar cómo se relaciona el URI objetivo con el ''Recurso sujeto''. El Recurso sujeto es el elemento de recurso padre más cercano.