Как я должен обрабатывать ссылки и ссылки HATEOAS в JSON?
Я в процессе разработки REST api и быть таким же спокойным, как он получает. Я хочу включить HATEOAS в ответы json.
добавление URL-адресов к связанным ресурсам достаточно просто, но было некоторое обсуждение структуры для использования этих ссылок.
многие статьи, которые я нашел, используют структуру, заимствованную из атом ленты:
"links": [
{"rel": "self", "href":"http://example.org/entity/1"},
{"rel": "friends", "href":"http://example.org/entity/1/friends"}, ...
]
Это вызвало некоторые вопросы:
-
зачем использовать массив в качестве контейнера? согласно разработчику javascript, которого я знаю, доступ к ссылкам будет проще с ссылками как свойствами объекта. Например:
"self": { "href":"http://example.org/entity/1" }, /* (facebook uses this) */ "friends": { "href":"http://example.org/entity/1/friends", "type": "..."}
-
есть ли общая структура json (опять рядом с адаптацией атома) для описания ссылок в свойствах ресурсов? (например, отправитель сообщения).
ссылка вероятно, следует снова разрешить как url-адрес, но было бы плохо включить простой идентификатор? вроде как:
"sender": { "id": 12345, "href": "resource-uri" }
мой способ мышления заключается в том, что, хотя HATEOAS делает это так, что клиенту не нужно много знаний для использования API, я неохотно удаляю возможность использовать эти знания (например, доступ к изображению профиля, создавая клиентскую сторону ссылки, не глядя на пользователя в первую очередь).
3 ответов
я перезапустил эту тему в группе API-Craft google и получил отличные ответы.
основными преимуществами конструкции массива:
- несколько ссылок для одного и того же отношения
- несколько отношений для одной и той же ссылки без написания ссылки aggain
- возможность заказать ссылки
карта причин имеет лучшую доступность.
насколько структура идет там много возможности:
- JSON-HAL:http://blog.stateless.co/post/13296666138/json-linking-with-hal или также http://stateless.co/hal_specification.html
- JSON-LD:http://json-ld.org/ (необязательно с помощью Гидра словарь)
- JSON-Schema:http://json-schema.org/ (метасхема theHyper в нижней части страницы)
- коллекция+JSON: http://amundsen.com/media-types/collection/
Я думаю, я пойду с HAL, так как это самое чистое решение, остальные все выглядят вроде... странно для JSON.
Что касается структуры, вы можете попробовать посмотреть на HAL (http://stateless.co/hal_specification.html) или JSON-LD: (http://json-ld.org/)
Я думаю, что это так, что вы можете предложить несколько ссылок на основе метода http.
например
"links": [
{"rel": "sender", "method":"post", "href":"http://example.org/entity/1"},
{"rel": "sender", "method":"put", "href":"http://example.org/entity/1"}, ...
]
возможно, вы могли бы адаптировать это к своей идее
"sender": {
"href":"http://example.org/entity/1",
"methods": ["put","post"]
}