首页 > 解决方案 > 从 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);
    }

标签: restspring-bootspring-hateoas

解决方案


根据HAL 规范,您可以渲染单个资源及其内容和一组链接,也可以渲染一个聚合资源,该资源具有在此资源中容纳多个资源的空间。

在您的域模型中,您清楚地显示了多个文档,每个文档都有一个不同的selfURI(/characters/1/characters/2等),因此,您提供的不是单个项目资源,而是聚合根。

如果你阅读 HAL 规范,你会在下面找到这个定义_embedded

它是一个对象,其属性名称是链接关系类型(由 RFC5988 定义),值是 Resource Object 或Resource Objects 数组

实际上,在 HAL 规范中查找单词数组,只会将您带到上面引用的部分和_links部分。

因此,_embedded这是在 HAL 中呈现资源数组的合适位置。


推荐阅读