Одно из требований, которое должно быть удовлетворено, прежде чем вы сможете вызвать API «RESTful», заключается в том, что должна быть возможность написать универсальное клиентское приложение поверх этого API. С универсальным клиентом пользователь должен иметь доступ ко всем функциям API. Универсальный клиент - это клиентское приложение, которое не предполагает, что какой-либо ресурс имеет конкретную структуру, выходящую за рамки структуры, определенной типом носителя. Например, веб-браузер - это универсальный клиент, который знает, как интерпретировать HTML, включая HTML-формы и т. Д.
Теперь предположим, что у нас есть HTTP / JSON API для интернет-магазина, и мы хотим создать клиент HTML / CSS / JavaScript, который предоставит нашим клиентам превосходный пользовательский интерфейс. Будет ли реалистичным вариант, чтобы этот клиент был универсальным клиентским приложением? Нет. Мы хотим предоставить конкретный внешний вид для каждого конкретного элемента данных и каждого конкретного состояния приложения. Мы не хотим включать все знания об этих особенностях представления в API, напротив, клиент должен определять внешний вид, а API должен только переносить данные. Это подразумевает, что клиент имеет жестко запрограммированную привязку определенных элементов ресурса к конкретным макетам и взаимодействиям с пользователем.
Это конец HATEOAS и, следовательно, конец REST? Да и нет .
Да , поскольку, если мы жестко закодируем знания об API в клиенте, мы теряем преимущество HATEOAS: изменения на стороне сервера могут сломать клиента.
Нет , по двум причинам:
- Быть "RESTful" является свойством API, а не клиента. Если это возможно, в теории , для создания универсального клиента, который предлагает все возможности API, API можно назвать RESTful. Тот факт, что клиенты не подчиняются правилам, не является ошибкой API. Тот факт, что у общего клиента будет паршивый пользовательский опыт, не является проблемой. Почему важно знать, что возможно иметь универсального клиента, если у нас на самом деле нет этого универсального клиента? Это подводит меня ко второй причине:
- RESTful API предлагает клиентам возможность выбрать, какими универсальными они хотят быть, то есть насколько они устойчивы к изменениям на стороне сервера, которые они хотят. Клиенты, которым необходимо обеспечить удобство работы с пользователями, могут по-прежнему быть устойчивыми к изменениям URI, изменениям значений по умолчанию и многим другим. Клиенты, выполняющие пакетные задания без взаимодействия с пользователем, могут быть устойчивы к другим изменениям.
Если вас интересуют практические примеры, закажите мою JAREST бумагу . Последний раздел о HATEOAS. Вы увидите, что с JAREST даже очень интерактивные и визуально привлекательные клиенты могут быть достаточно устойчивыми к изменениям на стороне сервера, но не на 100%.