Одна из основных идей, лежащих в основе HATEOAS, заключается в том, что клиенты должны иметь возможность запускаться с единого URL-адреса точки входа и обнаруживать все доступные ресурсы и переходы состояний, доступные для них. Хотя я прекрасно вижу, как это работает с HTML и человеком, стоящим за браузером, нажимающим на ссылки и кнопки «Отправить», меня спрашивают, как этот принцип можно применить к проблемам, с которыми мне (не) повезло иметь дело.
Мне нравится, как принцип дизайна RESTful представлен в статьях и учебных статьях, где все имеет смысл, Как получить чашку кофе - хороший тому пример. Я постараюсь следовать соглашению и предложить простой и свободный от утомительных деталей пример. Давайте посмотрим на почтовые индексы и города.
Проблема 1
Допустим, я хочу разработать RESTful api для поиска городов по почтовым индексам. Я придумал ресурсы под названием «города», вложенные в почтовые индексы, так что GET on http://api.addressbook.com/zip_codes/02125/cities
возвращает документ, содержащий, скажем, две записи, которые представляют Дорчестер и Бостон.
У меня вопрос: как можно найти такой URL-адрес через HATEOAS? Вероятно, нецелесообразно выставлять индекс всех ~ 40K почтовых индексов в http://api.addressbook.com/zip_codes
. Даже если индекс элементов в 40 КБ не является проблемой, помните, что я придумал этот пример, и существуют коллекции гораздо большего размера.
По сути, я хотел бы раскрыть не ссылку, а шаблон ссылки, скорее, вот так: 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?