Остальные API Hateoas: должны ли ответы API иметь идентификаторы как жестко запрограммированные или как заполнители? - PullRequest
0 голосов
/ 06 апреля 2020

Ссылка на HATEOAS Это ссылка на статью Hateoas (снимок ниже), где идентификаторы ресурса являются частью URL, т.е. 12345. Здесь ответ API имеет окончательный относительный URL API, т.е. / account / 12345 / deposit, и клиенту просто нужно нажать его.

Hateoas wikipedia picture

Ссылка на API пользователей Github Это ссылка на Github API (снимок ниже), где есть много заполнителей для идентификаторов. Как клиенты изменят эти URL-адреса и добавят значение в эти заполнители? Например, {/ gist_id}, {/other_usergoti.

Не лучше ли передать URL со значением id вместо заполнителя? Почему и когда можно полагаться на разных клиентов для добавления значений в эти заполнители?

enter image description here

Ответы [ 3 ]

1 голос
/ 06 апреля 2020

Гипертекст как движок состояния приложения (HATEOAS) - это нечто большее, чем просто использование ссылок. По сути, он навязывает модель взаимодействия, которая используется в Интернете в течение двух десятилетий довольно успешно. В Интернете сервер обычно «учит» клиентов (браузеров) достигать чего-либо с помощью отношений ссылок , которые можно использовать для автоматической загрузки связанных ресурсов или указания на ссылочный ресурс, и Веб-формы , которые определяют синтаксис и семантику каждого из соответствующих поддерживаемых (входных) элементов, то есть текстового поля, элемента параметра для выбора одного или нескольких вариантов выбора, раскрывающегося списка или даже виджета слайдера. На основании возможности каждого из элементов, которые знает клиент, т. Е. Что кнопка хочет быть нажата или нажата, в то время как текстовые поля хотят некоторого пользовательского ввода и прочее, или ссылку, помеченную именем отношения ссылки prefetch может загружаться автоматически после завершения загрузки текущей страницы, так как клиент может вызвать ее в следующий раз, или отношение ссылки preload может дать указание агенту пользователя загрузить указанный ресурс в начале процесса загрузки текущей страницы.

Форма не только рассказывает клиенту о поддерживаемых полях, которые есть у ресурса, но и о целевом URI, на который отправляется запрос, HTTP-метод для использования при отправке запроса, а также медиа-тип, который в случае веб-форм обычно неявно установлено на application/x-www-form-urlencoded.

В идеальном мире клиент просто использует информацию, предоставленную сервером. К сожалению, мир не идеален, и со временем люди придумали множество других решений. Одним из них является URI-шаблон , который в основном позволяет клиентам использовать базовый c URI и заполнять определенные заполнители конкретными значениями. Поскольку использование шаблонов требует некоторого знания намерения URI или параметров, которые необходимо передать, такие возможности имеют смысл только как часть поддержки медиа-типа.

Обычный JSON (application/json) по умолчанию вообще не поддерживает URI, и поэтому пользовательский агент, получающий простую полезную нагрузку JSON, может не иметь возможности автоматически заменить шаблонный URI на конкретный. из коробки. JSON Гипер-схема (application/schema+json) пытается добавить поддержку ссылок и шаблонов URI для простых JSON полезных нагрузок. Пользовательский клиент, тем не менее, должен иметь подсказку с соответствующим медиа-типом для автоматического разрешения полного URI. Таким образом, пользовательский агент также должен поддерживать соответствующий тип мультимедиа, иначе он не сможет успешно обработать документ (преобразовать URI шаблона в реальный URI).

JSON Язык приложений гипертекста aka HAL JSON также поддерживает шаблоны URI для ссылок. application/collection+json поддерживает два вида шаблонов - шаблоны запросов и объекты-шаблоны . Первый пример похож на шаблон URI, позволяя добавлять определенные параметры запроса к целевому URI при отправке запроса, в то время как последний позволяет определить целый объект, который содержит все входные элементы, используемые для добавления или редактирования элемента в коллекции. , JSON -LD на самом деле не поддерживает AFAIK для шаблонов URI, хотя использует концепцию так называемого контекста, в котором определенные термины могут использоваться для сокращения URI. Таким образом, что-то вроде name может использоваться в контексте для URI, подобного http://schema.org/name.

. Как можно надеяться, поддержка шаблонов URI зависит от типа носителя, используемого для обмена данными. В случае описанного примера github GET /users/:username это более или менее напоминает типичную документацию Web API, аналогично тому, как это делается в документации Swagger API , к которой, к сожалению, вряд ли имеет какое-либо отношение HATEOAS .

0 голосов
/ 07 апреля 2020

По моему мнению, мы не должны давать прямой URL в теле. Мы всегда должны параметризовать API и получать там детали. В простом случае, если идентификатор данных изменяется, чем каждый раз, когда данные необходимо обновить для подробного URL. Иначе, если это будет динамически c, вы никогда не столкнетесь с этой проблемой. И это также подпадает под лучшие практики.

0 голосов
/ 06 апреля 2020

Для вашего лучшего примера (банковское дело) вы должны обязательно включить полный URL-адрес с номерами счетов (идентификаторами), чтобы клиенту не нужно было ничего переводить / заменять. Это наиболее распространенный сценарий с HATEOAS. Однако GitHub имеет те «заполнители» для конечных точек, которые могут содержать несколько значений. Вы не можете включить "follow_url" для каждого пользователя в ответ, это не практично. Таким образом, вы должны определить значение «other_user» другим способом и произвести подстановку. Лично у меня даже не было такого варианта использования ни с одним из моих приложений, и все мои URL-адреса HATEOAS напоминают вам первый пример (хотя я предпочитаю полные URL-адреса, а не относительные). Если у вас нет конкретных c случаев, как в GitHub, нет необходимости использовать какие-либо из этих заполнителей. Даже GitHub использует только то, где они могут иметь несколько значений. Для фиксированных URL-адресов у них есть имя пользователя (например, номер вашей учетной записи) в URL-адресе («octocat»).

...