HATEOAS с JSON через HTTP

У меня есть простой CRUD-подобный веб-API, использующий JSON через HTTP (репозиторий Person сущностей, приложение для контактов). Теперь я хотел бы спроектировать его таким образом, чтобы он хорошо вписывался в архитектуру RESTful. Все довольно просто, кроме одного:

Как я могу выполнить ограничение HATEOAS, если у меня нет html? Что хорошего, устанавливает способы выполнения HATEOS, если основным (в настоящее время единственным) типом контента является JSON, который просто содержит фактические сущности за ресурсом/url?

Одна вещь, которая приходит на ум, это HTTP-заголовок link, но действительно ли это правильный путь?


person bitbonk    schedule 07.12.2013    source источник


Ответы (2)


В то время как простой JSON не позволяет вам связывать отношения, существуют другие типы мультимедиа, которые строятся на основе JSON (во многом так же, как Atom строит XML). Лично мне больше всего нравится язык гипертекстовых приложений (HAL).

Насколько я понимаю заголовки ссылок, они должны использоваться для типов мультимедиа, которые на самом деле не позволяют использовать ссылки... такие вещи, как изображения и другие нетекстовые ресурсы. Хотя вы можете использовать заголовки ссылок для текстовых ресурсов, у вас нет такой же гибкости для таргетинга на отдельные части ресурса; вы в значительной степени застряли в ссылках на / со всего ресурса.

person Jonathan W    schedule 08.12.2013

Не усложняйте вещи специальными типами носителей. В своей магистерской диссертации я воспользовался заголовком ссылки для подключения к другим связанным ресурсам. Кроме того, я добавил гиперссылки внутри json, используя комбинацию типа отношения URL и URL-ссылки http. Json не является форматом гипермедиа, но его можно использовать как таковой. См. mime JSON: vnd.collection + JSON.

Лучший совет, который я могу дать, — максимально использовать заголовок ссылки, пока сообщество не решит, как внедрить ненависть в API. Используйте уже имеющиеся типы отношений (микротип) и определите свои собственные.

person Orri    schedule 10.12.2013