Выполняйте эффективные вызовы REST-API с помощью HATEOAS

Я думаю, что в основном понимаю, что такое HATEOAS и почему вы должны его использовать. Однако у меня есть некоторые проблемы с применением этого к реальному сценарию.

Например:

Я хотел бы отобразить список встреч в своем клиентском приложении. Встреча состоит из даты, места и человека. Вся эта информация должна быть отображена в таблице.

Ответ моего API в настоящее время выглядит примерно так:

{
  "id": 1,
  "date": "2020-01-01",
  "location": {
    "name": "my office",
    "address": "my street 22"
  },
  "person": {
    "name": "john",
  } 
},   
{
  "id": 2,
  "date": "2020-01-22",
  "location": {
    "name": "your office",
    "address": "your street 30"
  },
  "person": {
    "name": "peter",
  } ​
}

Таким образом, каждый объект назначения также содержит все связанные объекты. Это делает получение данных из REST API эффективным, с моей точки зрения, поскольку мне нужен только один вызов API. Например:

api.com/appointments

С HATEOAS ответ API, вероятно, будет выглядеть примерно так:

{
  "id": 1,
  "date": "2020-01-01",
  "location": {
    "url": "api.com/location/{id}",
  },
  "person": {
    "url": "api.com/person/{id}",
  } 
},    
{
  "id": 2,
  "date": "2020-01-22",
  "location": {
    "url": "api.com/location/{id}",
  },
  "person": {
    "url": "api.com/person/{id}",
  } ​
}

Мне пришлось бы получать связанные объекты с помощью дополнительных вызовов API.

Давайте теперь предположим следующее:

Я хотел бы отобразить список из 100 встреч. Каждая встреча назначается другому человеку и в другом месте. Поэтому мне понадобится вызов API, чтобы получить все встречи, еще 100 вызовов API, чтобы получить все местоположения, и еще 100 вызовов API, чтобы получить всех людей. Всего 202 вызова API.

Мне это кажется не очень эффективным. У меня здесь ошибка или как HATEOAS будет работать в таком сценарии?


person OPunktSchmidt    schedule 17.05.2021    source источник


Ответы (2)


Вы путаете REST с базой данных. Вы можете расширить вложенные ресурсы, если этого хотят ваши клиенты. HATEOAS больше касается добавления полезных операций к вашим ресурсам, чтобы вы могли искать, читать, разбивать на страницы, изменять, создавать и удалять их, если хотите. Что касается REST API, вы должны смотреть на него так, как если бы это была веб-страница. Если вы хотите увидеть все встречи в таблице вместе с кнопками редактирования или удаления, вы отправляете обратно модель представления для этой таблицы вместе со ссылками для редактирования или удаления. Клиент REST обычно работает на стороне сервера, а приложение, которое его использует, является потребителем службы REST. Таким образом, служба REST обычно не находится в прямом контакте с пользователем, а клиент REST не запускается в браузере, хотя его можно использовать и с одностраничными JS-приложениями, но он не предназначен для такого использования.

person inf3rno    schedule 17.05.2021
comment
Большое спасибо. Таким образом, даже при использовании HATEOAS связанные объекты могут быть возвращены напрямую, если это необходимо для варианта использования. HATEOAS не ограничивает меня в дизайне моих объектов DTO. Кажется, теперь я понял :) - person OPunktSchmidt; 18.05.2021

как HATEOAS будет работать в таком сценарии?

Как бы вы сделали это с веб-страницей?

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

И это хорошо.

Иногда мы используем эту веб-страницу, чтобы отобразить обзор данных и предоставить ссылку, которая инструктирует клиента, как найти более подробное представление данных.

И это тоже нормально.

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

person VoiceOfUnreason    schedule 17.05.2021