HATEOAS добавил в закладки URL-адрес

Я пытаюсь разобраться в HATEOAS.

Давайте работать через пример. Клиент загружает браузер на getemails.com. Для простоты предположим, что вызов getemails.com попадает на сервер, и он возвращается со списком электронных писем. Каждое письмо имеет ссылку, которая позволит пользователю получить более подробную информацию. Что-то вроде этого:

{[
    {
        "id": "1",
        "subject" : "subject something",
        _links:[
            "email":"http://getemails.com/emaildetail/1"
        ]
    }
    {
        "id": "2",
        "subject" : "subject something else",
        _links:[
            "email":"http://getemails.com/emaildetail/2"
        ]
    }
]}

Это отображается пользователю на столе. Затем пользователь нажимает на строку, и клиентский код получает URL-адрес электронной почты из-под ссылок _ выбранной строки и выполняет вызов на сервер. Затем он обновит страницу (при условии SPA) с данными электронной почты. Он также обновит адрес до getemails.com/#email/1

А что если пользователь добавит в закладки местоположение getemails.com/#email/1? Поскольку клиентское приложение для начала не загрузило список электронных писем, как оно узнает, что URL-адрес сервера, с которого нужно получить дополнительную информацию, - это emaildetail / 1?

1 ответ

Решение

Ваша проблема в том, что вы не по-настоящему RESTful. Разоблачение внутренней работы как поля id - это ловушка, которую вы должны избегать. Этот идентификатор имеет смысл только внутри вашего сервиса, его нельзя распространять за его пределы, как вы это сделали.

вместо этого используйте собственную ссылку на каждый из ваших ресурсов, поэтому, когда вы запрашиваете отношения "электронная почта", вы должны возвращать ресурс электронной почты (предположительно)

{
  "subject" : "subject something",
  "text" : "yadda yadda yadda...",
   "from" : "here@there.com",
   _links:{
       "self":"http://getemails.com/emaildetail/1"
   }
}

используйте этот собственный URL в идентификаторе фрагмента вашего SPA. теперь, когда пользователь закладывает этот полный URL getemails.com/#http://getemails.com/emaildetail/1 (с некоторой кодировкой URL) ваше приложение будет знать, какой ресурс извлечь и представить.

Другие вопросы по тегам