Предположим, у меня есть RESTful API для управления заказами, который использует HAL для облегчения HATEOAS:
GET /orders/2
{
"_links": {
"self": "/orders/2",
"items": "/orders/2/items"
},
"subtotal": 30.0,
"shipped": false
}
Я хочу написать свой клиент (приложение), используя набор интерфейсов, так что, предполагая, что реализации этих интерфейсов являются DI-d/построены фабриками DI-d и т. д., мне действительно (хочу) не нужно заботиться что они поддерживаются моим RESTful API. В качестве примера (псевдо С#/Java):
public interface Order {
public void addItem(Item item);
public float getSubtotal();
public boolean getShipped();
}
Order order = ...;
Item item = ...;
order.addItem(item);
...(order.getSubtotal())...;
У меня вопрос: есть ли смысл создавать реализации интерфейса Order
/Item
из API? Под этим я подразумеваю способ, аналогичный тому, что предлагается в C#/веб-сервисах, которые экспортируют WSDL.
Я думал о реализации OPTIONS
для таких ресурсов, как /orders
и /orders/{id}
, чтобы у меня был API HATEOAS для обхода схемы API:
GET /orders/* (I'd need a suitable wildcard of course)
{
"_links": {
"addItem": {
"href": "/orders/{id}/items",
"templated": true,
"type": "method"
}
}
}
Конечно, я мог бы сделать так, чтобы эта часть объекта _links
возвращалась с любым заданным ресурсом (например, /orders/2
), но это исключает генерацию статического кода.
Мне интересно, есть ли разумный способ инкапсулировать тот факт, что если указана конкретная ссылка, соответствующее действие должно быть доступно/выполнено, иначе нет.
Примечание. Если это имеет значение, на самом деле я работаю с JavaScript (в частности, с AngularJS). Однако я все же хотел бы написать свое приложение, используя набор концептуальных интерфейсов/контрактов.