как следует обращаться с Hateoas из frontend?


У меня есть этот вопрос, который уже некоторое время крутится у меня в голове. Предположим, что мы структурировали наш проект с помощью backend и frontend на отдельных слоях. Итак, от frontend мы хотим получить костюмер, который поставляется в формате hal+json:

GET /customers/1 HTTP/1.1
Accept: application/hal+json
{
    "name": "Alice",
    "links": [ {
        "rel": "self",
        "href": "http://localhost:8080/customer/1"
    } {
        "rel": "transactions",
        "href": "http://localhost:8080/customer/1/transactions"
    }]
}

Затем, с помощью интерфейса я хочу получить все транзакции клиентов. Мой вопрос: как я должен получить url? должно ли это быть от ответа? или я должен построить его внутренне?

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

Если мы пойдем со вторым вариантом, я не понимаю, как построить этот url, если у нас на самом деле нет идентификаторов. Как я могу создавать новые транзакции клиентов, если hateoas заменяет идентификаторы ссылками, и у меня больше нет ссылки на объект в теле?

Я подумал, что, возможно, сервис должен поддерживать оба application/hal+json (ориентирован на пользователей) и application/json(ориентирован на клиентов), но я не вижу, как это делается вообще.

Что вы думаете?

2 5

2 ответа:

Определенно первый вариант. А именно, поскольку HATEOAS является заключительной стадией модели зрелости Ричардсона , клиенты должны следовать предоставленным ссылкам, а не создавать URL-адреса самостоятельно:

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

Какую пользу это приносит? Я могу придумать по крайней мере два:

  • простое обновление REST API - разработчики на стороне сервера могут изменять URI ресурсов, не нарушая клиентский код, поскольку клиенты просто следуют предоставленным ссылкам; кроме того, разработчики на стороне сервера могут легко добавлять новые ссылки
  • надежность-следуя по ссылкам, клиентский код никогда не будет пытаться получить доступ к неработающим ссылкам, ошибочным ссылкам и т. д.

В: также может возникнуть ситуация, когда у нас нет ссылки на запрос, который мы хотим сделать?

Это до API designer, чтобы гарантировать, что все необходимые ссылки предоставляются. Front-end разработчик не должен беспокоиться об этом.

Смотрите также:

HATEOAS (Hypermedia as the Engine of Application State) является ограничением архитектуры остальных приложений. Вы можете посмотреть на документацию Spring HATEOAS, например:

Https://spring.io/understanding/HATEOAS

Еще одна ссылка об этом с помощью Spring и AngularJS доступна здесь:

AngularJS и Spring HATEOAS учебник

Этот, кажется, достаточно хорош и обрабатывает ваш вариант использования.

С Уважением, Андре