rest - 从 REST 资源集合中删除 _embedded
问题描述
也许这违反了 REST/HAL 原则,但我认为如果我正在查看项目列表,它们不应该包含在_embedded
标签中。/characters
以下是我在 Spring Boot 应用程序中导航到时返回的详细信息。
由于它们是页面的主要焦点,我原本预计_embedded
不会出现characterDescriptions
,是否有可能实现这一目标?我应该尝试实现这一目标还是_embedded
成为这里的常态?
在相关说明中,当我使用链接(例如)导航到特定资源时,characters/1
我应该链接回/characters
父页面还是只在这些类型的端点包含自链接是可以接受的(我最终将链接给这里的用户,但这是关于 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);
}
解决方案
根据HAL 规范,您可以渲染单个资源及其内容和一组链接,也可以渲染一个聚合资源,该资源具有在此资源中容纳多个资源的空间。
在您的域模型中,您清楚地显示了多个文档,每个文档都有一个不同的self
URI(/characters/1
、/characters/2
等),因此,您提供的不是单个项目资源,而是聚合根。
如果你阅读 HAL 规范,你会在下面找到这个定义_embedded
:
它是一个对象,其属性名称是链接关系类型(由 RFC5988 定义),值是 Resource Object 或Resource Objects 数组。
实际上,在 HAL 规范中查找单词数组,只会将您带到上面引用的部分和_links
部分。
因此,_embedded
这是在 HAL 中呈现资源数组的合适位置。
推荐阅读
- java - 在全屏Android应用程序中禁用状态栏?
- c# - 返回要在 EntityFrameworkCore 中使用的类类型
- swift - 选择图像时未捕获的异常“NSInvalidArgumentException”
- r - 如何在 R 中以给定权重创建具有两个值(或名称)的列
- amazon-quicksight - Quicksight 数据透视表排序不起作用
- java - spring boot 应用程序无法检测到信任库
- docker - Dockerfile COPY 与“docker run ... cp”
- c# - OmniSharp.MSBuild.ProjectManager 错误,即使在 dot net 已成功安装后
- python - 停止/停止python代码运行的命令
- json - NextJS - JSON 中位于位置 0 的意外标记 <