从REST资源集合中删除_embedded

时间:2018-05-23 13:25:38

标签: rest spring-boot spring-hateoas

这可能违反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);
    }

1 个答案:

答案 0 :(得分:0)

根据the HAL spec,您可以呈现具有其内容和链接集的单个资源,也可以呈现聚合资源,该资源在此资源内具有多个资源。

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

如果您阅读了HAL规范,则会在_embedded下找到该定义:

  

该对象的属性名称是链接关系类型(由RFC5988定义),值是资源对象或 资源对象数组

>

实际上,在HAL规范中查找 array 一词只会使您转到上面引用的部分以及_links部分。

因此,_embedded是在HAL中渲染资源数组的适当位置。