这可能违反REST / HAL原则,但我认为如果我查看项目列表,则不应将其包含在_embedded
标记中。以下是我在Spring启动应用程序中导航到/characters
时返回的详细信息。
我原本预计_embedded
不会出现characterDescriptions
,因为它们是页面的主要焦点,是否有可能实现这一目标?我应该尝试实现这一目标还是_embedded
成为常态?
在我使用链接(例如characters/1
)导航到特定资源时的相关说明中,我应该链接回/characters
父页面还是仅包含自我-link在这些类型的端点(我最终将链接到用户,但这是关于REST端点的一般问题)
返回此JSON的控制器方法低于JSON
{
"_embedded": {
"characterDescriptions": [
{
"characterName": "Adrak",
"playerName": "Liam",
"userName": "liam",
"_links": {
"self": {
"href": "http://localhost:8080/characters/1"
}
}
},
{
"characterName": "Thorny",
"playerName": "Aedo",
"userName": "aedo",
"_links": {
"self": {
"href": "http://localhost:8080/characters/2"
}
}
},
{
"characterName": "Anin",
"playerName": "Saoirse",
"userName": "saoirse",
"_links": {
"self": {
"href": "http://localhost:8080/characters/3"
}
}
}
]
},
"_links": {
"self": {
"href": "http://localhost:8080/characters"
}
}
}
以下是相关方法
@GetMapping
public ResponseEntity<Resources<Resource<CharacterDescription>>> getAllCharacterDescriptions( ) {
List <Resource<CharacterDescription>> characters = repository.findAll()
.stream().map( character -> {
Link characterLink = linkTo(methodOn(CharacterDescriptionController.class)
.getCharacterDescription(character.getCharacterId()))
.withSelfRel();
return new Resource<>(character, characterLink);
}).collect(Collectors.toList());
Link allCharacterLink = linkTo(methodOn(CharacterDescriptionController.class)
.getAllCharacterDescriptions(auth))
.withSelfRel();
Resources<Resource<CharacterDescription>> resources = new Resources<>(characters, allCharacterLink);
return ResponseEntity.ok(resources);
}
答案 0 :(得分:0)
根据the HAL spec,您可以呈现具有其内容和链接集的单个资源,也可以呈现聚合资源,该资源在此资源内具有多个资源。
在域模型中,您清楚地显示了多个文档,每个文档具有不同的self
URI(/characters/1
,/characters/2
等),因此,您没有提供单项资源,而是聚合根。
如果您阅读了HAL规范,则会在_embedded
下找到该定义:
该对象的属性名称是链接关系类型(由RFC5988定义),值是资源对象或 资源对象数组 。
>
实际上,在HAL规范中查找 array 一词只会使您转到上面引用的部分以及_links
部分。
因此,_embedded
是在HAL中渲染资源数组的适当位置。