Одной из основных идей, лежащих в основе HATEOAS, является то, что клиенты должны иметь возможность начинать с URL единой точки входа и обнаруживать все открытые ресурсы и переходы состояний, доступные для них. Хотя я прекрасно понимаю, как это работает с HTML и человеком за браузером, нажимая на ссылки и кнопки "Отправить", я спрашиваю о том, как этот принцип может быть применен к проблемам, с которыми мне (не) повезло иметь дело.
Мне нравится, как принцип дизайна RESTful представлен в документах и учебных статьях, где все имеет смысл, Как получить чашку кофе - хороший пример. Я попытаюсь следовать конвенции и придумаю пример, который прост и свободен от утомительных деталей. Давайте посмотрим на почтовые индексы и города.
Проблема 1
Скажем, я хочу создать RESTful api для поиска городов по почтовым индексам. Я придумываю ресурсы, называемые "городами", вложенными в почтовые индексы, поэтому GET на http://api.addressbook.com/zip_codes/02125/cities
возвращает документ, содержащий, скажем, две записи, которые представляют собой Дорчестер и Бостон.
Мой вопрос: каким образом этот url может быть обнаружен через HATEOAS? Вероятно, нецелесообразно выставлять индекс всех ~ 40K почтовых индексов под http://api.addressbook.com/zip_codes
. Даже если у вас нет проблем с индексом 40K, помните, что я сделал этот пример, и там есть коллекции гораздо большей величины.
По сути, я бы хотел разоблачить не ссылку, а шаблон ссылки, а именно: http://api.addressbook.com/zip_codes/{:zip_code}/cities
, и это противоречит принципам и зависит от внеполосных знаний, которыми обладает клиент.
Проблема 2
Предположим, что хочу показать индекс города с определенными возможностями фильтрации:
-
GET on
http://api.addressbook.com/cities?name=X
будет возвращать только города с именами, соответствующимиX
. -
GET on
http://api.addressbook.com/cities?min_population=Y
приведет только к возврату городов с населением, равным или большим, чемY
.
Конечно, эти два фильтра могут использоваться вместе: http://api.addressbook.com/cities?name=X&min_population=Y
.
Здесь я бы хотел разоблачить не только URL-адрес, но и эти два возможных варианта запроса и тот факт, что их можно комбинировать. Это кажется просто невозможным без клиентского внеполосного знания семантики этих фильтров и принципов, сочетающих их в динамических URL-адресах.
Итак, как принципы HATEOAS могут помочь сделать такой тривиальный API действительно RESTful?