Удаление _embedded из коллекции ресурсов REST - PullRequest
0 голосов
/ 23 мая 2018

Возможно, это идет вразрез с принципами REST / HAL, но я подумал, что если я просматривал список элементов, они не должны содержаться в теге _embedded.Ниже приведены подробности, возвращаемые при переходе к /characters в моем приложении для весенней загрузки.

Я ожидал, что _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);
    }

1 Ответ

0 голосов
/ 27 ноября 2018

Согласно спецификации HAL вы можете либо визуализировать один ресурс с его содержимым и набором ссылок, либо вы можете отобразить агрегированный ресурс, в котором есть место для нескольких ресурсов внутри этого ресурса..

В вашей доменной модели вы четко показываете несколько документов, каждый с отдельным self URI (/characters/1, /characters/2 и т. Д.), Следовательно, вы не обслуживаете ни одного элементаресурс, но вместо этого совокупный корень.

Если вы прочитаете спецификацию HAL, вы найдете это определение под _embedded:

Это объект, имена свойств которого являются ссылкамитипы отношений (как определено в RFC5988) и значениями являются либо объектами ресурсов, либо массивом объектов ресурсов .

Фактически, ищем слово array в спецификации HAL ведет только к указанному выше разделу и к разделу _links.

Следовательно, _embedded является подходящим местом для отображения массива ресурсов в HAL.

...