Хорошо спроектированный HATEOAS API будет иметь четкие точки входа, и остальную часть поведения приложения можно будет обнаружить оттуда.
Поскольку вопрос касается HATEOAS, я бы сказал, что использование шаблона URI возлагает на клиента слишком большую ответственность. . Вместо этого вы должны указать явный URL-адрес для каждого допустимого действия над ресурсом с учетом текущего состояния приложения.
Это не просто стилистический момент. Если сервер предоставляет шаблон, то разработчик клиента должен написать код для заполнения шаблона, что создает связь между ними. Теперь вы не можете изменить структуру URL-адреса на стороне сервера, не нарушив контракт с его клиентами. С HATEOAS вы связываете URL-адрес с каждым действием, разрешенным на ресурсе, и клиент просто заботится о действии. URL-адрес фактически является непрозрачным дескриптором: "Выберите свое собственное приключение", как — говорит Ян Робинсон.
HATEOAS — это использование гипермедиа, содержащих ссылки на другие медиа, чтобы клиент мог перемещаться по приложению, не зная ничего, кроме последнего полученного ответа. Это означает, что каждый ответ должен предоставлять клиенту готовые к использованию URL-адреса, представляющие все допустимые действия с текущим ресурсом.
Помните, что то, что вы получаете по сети, — это всего лишь представление ресурса (REST расшифровывается как REpresentational State Transfer). Могут быть разные представления одного и того же ресурса в зависимости от вашего текущего контекста, скажем, вашего текущего набора разрешений и текущего состояния приложения. Разные представления могут правомерно предлагать разные последующие действия.
Используя ваш пример, владелец заказа может увидеть это:
{
"id": "/api/v1/orders/123", // reference to the current resource
"rel": {
"cancel": {
"url": "/api/v1/orders/cancel?order_id=123",
"method": "POST",
// Metadata about what the cancel operation returns...
},
"list_orders": {
"url": "/api/v1/orders",
"method": "GET",
// Metadata about what the list_orders operation returns...
},
// ...
// Other operations available to the owner
},
// ...
// Order state
}
Здесь я определяю карту, которая использует ключ в качестве имени операции или отношение в терминологии HATEOAS, хотя я мог бы также иметь список карт с ключом с именем "rel"
и значениями "cancel"
и "list_orders"
соответственно. .
Другая роль, например координатор доставки, может не видеть операцию cancel
, поскольку у нее нет разрешения на отмену заказа.
person
Daniel Terhorst-North
schedule
25.01.2015