Выбрать главу

       "ingredients" : [ {

           "name" : "Flour Tortilla",

           "type" : "WRAP",

           "_links" : {

               "self" : {

                   "href" : "http://localhost:8080/ingredients/FLTO"

               },

               "ingredient" : {

                   "href" : "http://localhost:8080/ingredients/FLTO"

               }

           }

       },

       ...

       ]

   },

   "_links" : {

       "self" : {

           "href" : "http://localhost:8080/ingredients"

       },

       "profile" : {

           "href" : "http://localhost:8080/profile/ingredients"

       }

   }

}

Вот Это Да! Не делая ничего, кроме добавления зависимости к вашей сборке, вы получаете не endpoint для ингредиентов, но и возвращающиеся ресурсы также содержат гиперссылки! Притворяясь клиентом этого API, вы также можете использовать curl, чтобы перейти по ссылке self для записи мучной лепешки (FLTO):

$ curl http://localhost:8080/ingredients/FLTO

{

 "name" : "Flour Tortilla",

 "type" : "WRAP",

 "_links" : {

   "self" : {

     "href" : "http://localhost:8080/ingredients/FLTO"

   },

   "ingredient" : {

     "href" : "http://localhost:8080/ingredients/FLTO"

   }

 }

}

Чтобы не отвлекаться, мы не будем тратить больше времени в этой книге, копаясь во всех endpoint и опциях, созданных Spring Data REST. Но вы должны знать, что он также поддерживает методы POST, PUT и DELETE для endpoint, которые он создал. Верно: вы можете вызвать POST для /ingredients, чтобы создать новый ингредиент, и DELETE для /ingredients/FLTO, чтобы удалить лепешки из меню.

Одна вещь, которую вы, возможно, захотите сделать, это установить базовый путь для API, чтобы его endpoints были различны и не конфликтовали ни с какими контроллерами, которые вы пишете. (Фактически, если вы не удалите созданный ранее IngredientsController, он будет мешать endpoints /ingredients, предоставляемой Spring Data REST.) Чтобы настроить базовый путь для API, установите свойство spring.data.rest.base-path:

spring:

 data:

   rest:

     base-path: /api

Это установит базовый путь для endpoint Spring Data REST в /api. Следовательно, конечной точкой ингредиентов теперь является /api/ingredients. Теперь проверим новый базовый путь, запросив список тако:

$ curl http://localhost:8080/api/tacos

{

"timestamp": "2018-02-11T16:22:12.381+0000",

"status": 404,

"error": "Not Found",

"message": "No message available",

"path": "/api/tacos"

}

О, Боже!  Это сработало не совсем так, как ожидалось. У вас есть сущность Ingredient и интерфейс IngredientRepository, которые Spring Data REST предоставляет с помощью endpoint /api/ingredients. Итак, если у вас есть сущность Taco и интерфейс TacoRepository, почему Spring Data REST не предоставляет endpoint /api/tacos?

6.3.1 Настройка путей ресурсов и имен отношений

На самом деле Spring Data REST предоставляет вам endpoint для работы с тако. Но насколько бы умным ни был Spring Data REST, он показывает несколько странным, в том как он предоставляет конечную точку tacos.

При создании endpoint для репозиториев Spring Data, Spring Data REST пытается мультиплицировать связанный класс сущностей. Для объекта Ingredient endpoint  является /ingredients. Для сущностей Order и User это /orders и /users. Пока все логично.

Но иногда, например, с “taco”,, оно путается в слове, и множественная версия не совсем верна. Как выяснилось, Spring Data REST назвала“taco” как “tacoes”, поэтому, чтобы сделать запрос на тако, вы должны учесть это и запросить /api/tacoes:

% curl localhost:8080/api/tacoes

{

   "_embedded" : {

       "tacoes" : [ {

           "name" : "Carnivore",

           "createdAt" : "2018-02-11T17:01:32.999+0000",

           "_links" : {

               "self" : {

                   "href" : "http://localhost:8080/api/tacoes/2"

               },

               "taco" : {

                   "href" : "http://localhost:8080/api/tacoes/2"

               },

               "ingredients" : {

                   "href" : "http://localhost:8080/api/tacoes/2/ingredients"

               }

           }

       }]

   },

   "page" : {

       "size" : 20,

       "totalElements" : 3,

       "totalPages" : 1,

       "number" : 0

   }

}

Вы можете быть удивлены, откуда я знал, что “taco” будет истолковано как “tacoes”. Оказывается, Spring Data REST также предоставляет домашний ресурс, содержащий ссылки для всех открытых endpoint. Просто сделайте запрос GET к базовому пути API:

$ curl localhost:8080/api

{

  "_links" : {

     "orders" : {

        "href" : "http://localhost:8080/api/orders"

     },

     "ingredients" : {

        "href" : "http://localhost:8080/api/ingredients"

     },

     "tacoes" : {

        "href" : "http://localhost:8080/api/tacoes{?page,size,sort}",

        "templated" : true

     },

     "users" : {

        "href" : "http://localhost:8080/api/users"

     },

     "profile" : {

        "href" : "http://localhost:8080/api/profile"

     }

  }

}

Как вы можете видеть, здесь есть ссылки для всех ваших сущностей. Все выглядит хорошо, за исключением ссылки tacos, где и имя отношения, и URL имеют нечетное множественное число “taco”.

Хорошей новостью является то, что вам не нужно мириться с этой маленькой причудой Spring Data REST. Добавив простую аннотацию к классу Taco, вы можете настроить как имя отношения, так и этот путь: