2016-01-21 7 views
1

Я пытаюсь реализовать архитектуру RESTFul, но я совершенно смущен относительно того, являются ли пользовательские медиа-типы хорошими или плохими.HATEOAS Content-Type: Custom mime-type

В настоящее время мое приложение передает «ссылки», используя заголовок Http Link:. Это здорово, я использую его с атрибутом title, позволяя серверу описать, что на самом деле это «действие», особенно когда оно представлено пользователю.

Где я смущен, должен ли я указать пользовательский тип mime или нет. Например, у меня есть концепция пользователя. Он может быть связан с текущим ресурсом. Я собираюсь составить пример и сказать, что у меня есть предмет на аукционе. Возможно, у пользователя есть возможность «наблюдать». Поэтому я хотел бы включить ссылку

<http://someuserrelation> rel="http://myapp/watching";title="Joe Blogg", methods="GET"

В заголовке. Если бы у вас была возможность удалить этого пользователя из просмотра, вы бы получили.

<http://someuserrelation> rel="http://myapp/watching";title="Joe Blogg", methods="GET,DELETE"

Я очень доволен этим, если клиент имеет правильную роль, которую он может удалить отношения. Поэтому я определяю, что делать с отношениями. Понятно, что мы называем GET этим ресурсом «отношения», я перенаправляю клиент к ресурсу пользователя.

Что меня смущает, следует ли использовать пользовательский тип mime. В Интернете есть аргументы как в Интернете, так и в моей голове.

Я сделал образец, в котором я вызываю HEAD на неизвестном URL-адресе, и сервер возвращает Content-Type: application/vnd.myapp.user. Затем мой клиент решает, может ли он понять этот тип mime (он поддерживает сопоставление ресурсов, которые он понимает в представлениях), и будет либо следовать за ним, либо объяснить, что он не может понять, что находится в конце этой ссылки.

Это плохо ?. Я должен поддерживать специальные мимические типы. Что особенно странно, я более чем счастлив использовать стандартный формат application/user, но не могу найти его нигде.

Я начинаю думать, что я должен попытаться полностью догадаться, что в любом ответе HTTP почти до такой степени, что, возможно, мой RESTFul api должен просто показывать html вместо того, чтобы пытаться что-либо сделать с помощью json/xml.

Я пробовал поиск (даже блог Роя Филдинга), но не может найти ничего, что описывает, как клиент должен иметь дело с такой ситуацией.

EDIT: аргумент, который у меня есть с включением настраиваемого типа, заключается в том, что он может не быть «пользователем», наблюдающим за элементом, это может быть что-то с application/vnd.myapp.group. Получая ответ, клиент знает, что у тела есть что-то другое, и поэтому меняйте представление, отображающее группы. Но является ли это соединение mime-type для просмотра плохого ?.

ответ

1

Я бы сказал, что вы определенно хотите иметь определенный медиа-тип для всех представлений. Если вы можете найти стандартный (html, jpeg, atom и т. Д.), Используйте это, но если нет, вы должны определить один (или несколько).

Причина: представления должны быть автономные. Это означает, что ваш клиент получает ссылку откуда-то, он должен знать, что с ним делать. Как отобразить его, как перейти оттуда и т. Д. Например, браузер знает, как отображать текст/html. Вы должны знать, как отображать/обрабатывать приложение/vnd.company.user.

Кроме того, я думаю, что у вас есть согласование контента назад. Вам не нужно вызывать HEAD, чтобы определить, какие представления поддерживает сервер. Вы можете сообщить серверу, что ваш клиент поддерживает в запросах GET/POST/etc, используя заголовок «Принимает». Действительно, это был бы стандартный способ сделать это. Затем сервер отвечает «лучшим» представлением, которое он может дать вам для ваших принятых типов mime. Вам не нужно больше круговых поездок.

Итак, хотя ссылки, которые вы предоставляете , могут содержать, содержащую контекстуальную информацию, обычно указанную в атрибуте 'rel', например, если ссылка указывает на «следующую страницу», «предыдущую страницу», «подписанный пользователь» или «владелец пользователя» и т. д., клиент не может принимать какое-либо представление по этим ссылкам. Он знает, что это семантически «пользователь», поэтому он может заполнить заголовок «Accepts» всеми поддерживаемыми представлениями для пользователя (application/vnd.company.user). Если в представлении указано только текст/xml, клиент не может принимать ни контент, ни семантику ссылок, которые он может получить.

На практике вы можете, конечно, закодировать любого клиента, чтобы просто предположить, какие представления находятся под ссылками/URL-адресами, и вам не обязательно соответствовать REST все время, но вы получаете много преимуществ (описано в Рой Филдинг), если да.

Еще одна второстепенная точка: ссылки не должны содержать какие методы доступны для данного ресурса, для чего нужны ОПЦИИ. По общему признанию, он редко реализуется.

+0

Посмотрите на то, что странно для меня, - это то, что клиенту и, возможно, типу mime почти нужно будет указать все возможные вещи, которые могут быть " смотреть. Я привел пример в будущем, возможно, об изменении ресурса, который стоит за «наблюдением», например, для группы. Вы сказали, что клиент семантически знает, что это пользователь .. но не так ли ?. Должен ли он получить тип mime, сервер отправляет обратно и обрабатывает его таким образом, а не принимает его 'application/vnd.app.user', что, если его другой ресурс, который также имеет это отношение ?. –

+0

Вам не нужно указывать, что ссылка указывает на пользователя, если вы этого не хотите. Но откуда вы знаете, что есть ссылка в первую очередь? Или что означает его атрибут «отношения»? Дело в том, что любая семантика, которую вы хотите назначить возвращенному представлению, должна быть через тип mime. Таким образом, вы, по крайней мере, должны определить, что есть потенциальные ссылки на подписчиков, и это можно сделать только через mime-тип. В противном случае сообщение не является самодостаточным. –

0

Вам не нужно отправлять HTML-код для поддержки гипермедиа. Существует много разных форматов гипермедиа, которые намного легче анализировать, чем HTML. https://sookocheff.com/post/api/on-choosing-a-hypermedia-format/https://stackoverflow.com/a/13063069/607033

Вам не нужно использовать тип MIME для домена, на мой взгляд, лучше использовать словарь, специфичный для домена, с общим типом гипермедиа, например. микроформаты или schema.org с JSON-LD + Hydra или ATOM/XML + microdata/RDFa и т. д. Существует много альтернатив в зависимости от вашего вкуса. http://schema.org/http://www.hydra-cg.com/

Я не уверен, является ли добавление того же отношения к нескольким методам хорошим выбором. Отправка нескольких ссылок с разными заголовками ссылок с помощью d, если вы хотите: https://stackoverflow.com/a/25416118/607033

Смежные вопросы