Одна из основных идей 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
Допустим, я хочу предоставить индекс городов с определенными возможностями фильтрации:
Конечно, эти два фильтра можно использовать вместе: http://api.addressbook.com/cities?name=X&min_population=Y
.
Здесь я хотел бы представить не только URL, но также эти два возможных варианта запроса и тот факт, что они могут быть объединены. Это кажется просто невозможным без внепланового знания клиентом семантики этих фильтров и принципов объединения их в динамические URL.
Так как принципы, лежащие в основе HATEOAS, могут помочь сделать такой простой API действительно RESTful?