Значение и использование "_embedded" в HATEOAS
Я использую Spring Data REST, который поддерживает HATEOAS. Я новичок в этой парадигме.
В ответах GET
моего веб-сервиса RESTful я часто получаю результаты внутри node с именем _embedded
.
Мне интересно: что такое _embedded
node для? Является ли он частью спецификации REST? Или часть спецификации HATEOAS? Или это специфично для их реализации Spring?
Это пример результата JSON для GET http://localhost:8080/mywebservice/features
:
{
"_links":
{
"search": { "href": "http://localhost:8080/mywebservice/features/search" }
},
"_embedded":
{
"features":
[
{
"feature": "GROUND",
"name": "Terreno",
"data_type": "String",
"_links":
{
"self" : { "href": "http://localhost:8080/mywebservice/features/GROUND" },
"values": { "href": "http://localhost:8080/mywebservice/features/GROUND }
}
},
...
]
}
}
Я заметил, что в ответе почти всегда есть _embedded
node: если я запрашиваю коллекцию, но даже если запрос одного ресурса выполняется поиском (например, с GET http://localhost:8080/mywebservice/persons/search/[email protected]@.com
).
Я не получаю _embedded
node, только если запрос предназначен для определенного ресурса, например, при выполнении GET http://localhost:8080/mywebservice/features/GROUND
.
Ответы
Ответ 1
Нет ни REST, ни спецификации HATEOAS. Оба являются только концепциями или архитектурными стилями, если хотите. _embedded
является частью формата HAL.
Он предназначен для встраивания (sic!) ресурсов, в противном случае будут возвращены только их URI. Например, GET http://localhost:8080/mywebservice/features
должен возвращать только список URI, например http://localhost:8080/mywebservice/features/GROUND
, и вам придется загружать каждый отдельный Feature
самостоятельно, если вам это нужно. Используя _embedded
все ресурсы Feature
вставляются в ответ, поэтому вам не нужно их отдельно загружать.