Этим утром я читал REST и натолкнулся на принцип HATEOAS («гипермедиа как двигатель состояния приложения») .
Цитирование REST Wikipediapage :
Клиенты выполняют переходы состояния только посредством действий, которые сервер динамически идентифицирует в гипермедиа (например, по гиперссылкам в гипертексте).За исключением простых фиксированных точек входа в приложение, клиент не предполагает, что какие-либо конкретные действия будут доступны для каких-либо конкретных ресурсов, помимо тех, которые описаны в представлениях, ранее полученных от сервера.
И Блог Роя Филдинга :
... если механизм состояния приложения (и, следовательно, API) не управляется гипертекстом, то он не может быть RESTful и не может быть REST API.Период.
Я читаю это так: клиент может запрашивать изменения состояния только на основании действий, доступных из тела ответа от сервера (гипертекст).
в HTMLмир, это имеет смысл.Клиент должен иметь возможность запрашивать изменения состояния (новые действия / страницы) только на основании ссылок, предоставленных ему через гипертекст (HTML).
Когда ресурс представлен другими способами - такими как JSON,XML, YAML и т. Д. Это не так очевидно.
Давайте рассмотрим пример «REST» JSON API:
Я создаю новый ресурс (например, новый комментарий), отправив запрос POSTна
/comments.json? # with params...
Сервер отвечает:
# Headers
HTTP/1.1 201 Created
Location: http://example.com/comments/3
Content-Type: application/json; charset=utf-8
... Etc.
# Body
{"id":3,"name":"Bodacious","body":"An awesome comment","post_id":"1"}
Я знаю, что теперь я могу получить доступ к этому комментарию по URI, возвращенному в заголовке: http://example.com/comments/3.json
Когда я посещаю http://example.com/comments/3.json, я вижу:
{"id":3,"name":"Bodacious","body":"An awesome comment","post_id":"1"}
Предположим, что документация API говорит мне, что я могу удалить этот комментарий, отправив запрос DELETE на тот же URI.Это довольно часто встречается среди API "REST".
Однако:
Ответ от сервера на GET http://example.com/comments/3.json
ничего не говорит мне о возможности удалить комментарий, отправив DELETEзапрос.Все, что мне показывает, это ресурс.
То, что я также могу УДАЛИТЬ комментарий с тем же URL-адресом, - это то, что клиент знает через внеполосную информацию (документацию) и не обнаруживается и не управляется ответом от сервера.
Здесь клиент имеет значение , предполагая, что действие DELETE (и возможные другие) доступны для этого ресурса, и эта информация ранее не была получена с сервера.
Я неправильно понял HATEOASили я прав, говоря, что API, соответствующий приведенному выше описанию, не будет, в строгом смысле, REST API?
Я знаю, что 100% -ное соблюдение REST не всегда возможно или наиболее прагматичноидти.Я разместил этот вопрос исключительно для того, чтобы удовлетворить свое собственное любопытство по поводу теории, лежащей в основе REST, а не для советов по наилучшей практике в реальном мире.