В последнее время я читал о гипермедиа как о механизме состояния приложения (HATEOAS), об ограничении, которое, как утверждается, делает веб-API «действительно RESTful». Это сводится к тому, чтобы в основном включать ссылки в каждый ответ на возможные переходы, которые вы можете сделать из текущего состояния.
Позвольте мне проиллюстрировать, что HATEOAS основан на моем понимании - и, пожалуйста, исправьте меня, если я что-то пропустил.
/
GET: {
"_links": {
"child": [
{ "href": "http://myapi.com/articles", "title": "articles" }
]
}
}
/articles?contains=HATEOAS
GET: {
"_items": [
{ "uri": "http://myapi.com/articles/0", "title": "Why Should I Care About HATEOAS?" },
{ "uri": "http://myapi.com/articles/1", "title": "HATEOAS: Problem or Solution?" }
],
"_links": {
"self": { "href": "http://myapi.com/articles", "title": "articles" },
"parent": { "href": "http://myapi.com/", "title": "home" }
}
}
POST: {
"title": "A New Article",
"body": "Article body",
"tags": [ "tag1", "tag2" ]
}
/articles/0
GET: {
"title": "Why Should I Care About HATEOAS?",
"body": "Blah blah blah"
"tags": [ "REST", "HATEOAS" ],
"_links": {
"self": { "href": "http://myapi.com/articles/0", "title": "article" },
"parent": { "href": "http://myapi.com/articles", "title": "articles" }
}
}
Утверждается, что HATEOAS предоставляет два основных преимущества:
Весь сервис доступен для обнаружения, начиная с корневого URI, документация больше не нужна.
Клиент отделен от сервера, который теперь может свободно изменять структуру URI. Это устраняет необходимость в версиях API.
Но, на мой взгляд, сервис - это намного больше, чем его структура URI. Чтобы использовать его эффективно, вам также необходимо знать:
- какие параметры запроса вы можете использовать и их возможные значения
- структура JSON / XML / любых документов, которые нужно отправить в запросах POST / PATCH / etc
- структура ответа, отправленного сервером
- возможные ошибки, которые могут возникнуть
- ...
Исходя из вышеизложенного, HATEOAS решает лишь небольшую часть проблем, связанных с обнаружением и связью. Вам все еще нужно задокументировать вышеупомянутые четыре аспекта, и клиенты по-прежнему будут сильно связаны с сервером из-за них. Чтобы избежать взлома клиентов, вам по-прежнему необходимо версия API.
Единственное преимущество, которое он дает, заключается в том, что вы можете более или менее свободно изменять свою структуру URL (кстати, что случилось с принципом «крутые URI не меняются» ?). Правильно ли мое понимание?
Единственное, что делает его настоящим REST API, - это соблюдение всех ограничений, а не только одного.
Вот почему нам нужны другие ограничения, самоописательное сообщение и т. Д.
Независимо от того, как вы пытаетесь, вам нужно будет версия вашего API. В REST-клиенте вам все еще нужно знать, как попасть на страницу, где вы хотите что-то делать, какие ссылки следует использовать и какие свойства вам нужно собрать на основе словаря RDF, описывающего сообщение. Если вам нужно заменить или удалить что-то из этого словаря, это, вероятно, сломает всех ваших клиентов, и вам понадобится новая версия. Поэтому я думаю, что REST - это не то, что вы должны публиковать рано (и выяснить модель, пока вы постоянно меняете API), иначе у вас будет много версий. Для начала вам нужна стабильная модель предметной области ...
источник