Настройка конечных точек HTTP в Spring Data REST

Настройка конечных точек HTTP в Spring Data REST

1. Вступление

Spring Data REST может удалить множество шаблонов, которые естественны для служб REST.

В этом руководстве мы узнаем, как использоватьcustomize some of Spring Data REST’s HTTP binding defaults.

2. Основы репозитория Spring Data REST

Для начала давайтеcreate an empty interface that extends the CrudRepository interface, указав тип нашей сущности и тип ее первичного ключа:

public interface UserRepository extends CrudRepository {}

По умолчаниюSpring generates all the mappings needed настраивает доступ к каждому ресурсу через соответствующие методы HTTP и возвращает правильные коды состояния.

Если нам не нужны все ресурсы, определенные вCrudRepository, мы можем расширить базовый интерфейсRepository иdefine only the resources we want:

public interface UserRepository extends Repository {
  void deleteById(Long aLong);
}

При получении запросаSpring reads the HTTP Method used and, depending on the resource type, calls the appropriate method defined in our interface, если он присутствует, или возвращает статус HTTP405 (Method Not Allowed) в противном случае.

Что касается приведенного выше кода, когда Spring получает запрос DELETE, он выполняет наш методdeleteById.

3. Ограничение того, какие методы HTTP предоставляются

Представим, что у нас есть система управления пользователями. Тогда мы могли бы иметьUserRepository.

И, поскольку мы используем Spring Data REST, мы многое получаем от расширенияCrudRepository:

@RepositoryRestResource(collectionResourceRel = "users", path = "users")
public interface UserRepository extends CrudRepository {}

All our resources are exposed using the default CRUD pattern, поэтому введите следующую команду:

curl -v -X DELETE http://localhost:8080/users/

вернет HTTP-статус204 (No Content returned) для подтверждения удаления.

Теперь предположим, чтоwe want to hide the delete method от третьих лиц, при этом имея возможность использовать его для внутренних целей.

Затем мы можем сначала добавить сигнатуру методаdeleteById в наш интерфейс, которая сигнализирует Spring Data REST о том, что мы собираемся его настроить.

Затем мы можем использовать аннотацию@RestResource(exported = false), которая будетconfigure Spring to skip this method when triggering the HTTP method exposure:

@Override
@RestResource(exported = false)
void deleteById(Long aLong);

Теперь, если мы повторим ту же командуcUrl, показанную выше, вместо этого мы получим HTTP-статус405 (Method Not Allowed).

4. Настройка поддерживаемых методов HTTP

Аннотация@RestResource также дает нам возможностьcustomize the URL path mapped to a repository method и идентификатор ссылки в JSON, возвращаемый обнаружением ресурсаHATEOAS.

Для этого мы используем необязательные параметры аннотации:

  • path для пути URL

  • rel  для идентификатора ссылки

Вернемся к нашемуUserRepository и добавим простой методfindByEmail:

WebsiteUser findByEmail(@Param("email") String email);

Выполнив отcUrl доhttp://localhost:8080/users/search/, мы теперь можем увидеть наш новый метод в списке с другими ресурсами:

{
  "_links": {
    "findByEmail": {
      "href": "http://localhost:8080/users/search/findByEmail{?email}"
    },
    "self": {
      "href": "http://localhost:8080/users/search/"
    }
  }
}

If we don’t like the default path, instead of changing the repository method, we can simply add the @RestResource annotation:

@RestResource(path = "byEmail", rel = "customFindMethod")
WebsiteUser findByEmail(@Param("email") String email);

И если мы сделаем обнаружение ресурса снова, полученный JSON подтвердит наши изменения:

{
  "_links": {
    "customFindMethod": {
      "href": "http://localhost:8080/users/search/byEmail{?email}",
      "templated": true
    },
    "self": {
      "href": "http://localhost:8080/users/search/"
    }
  }
}

5. Программная конфигурация

Иногда нам нужен более тонкий уровень конфигурации, чтобы предоставить или ограничить доступ к нашим HTTP-методам. Например, POST для ресурсов коллекции, а также PUT и PATCH для ресурсов элементов используют один и тот же методsave.

Starting from Spring Data REST 3.1, and available with Spring Boot 2.1,we can change the exposure of a specific HTTP method через классExposureConfiguration . Этот конкретный класс конфигурации предоставляет лямбда-API для определения как глобальных, так и основанных на типе правил.

Например, мы можем использоватьExposureConfiguration to ограничить запросы PATCH дляUserRepository:

public class RestConfig implements RepositoryRestConfigurer {
    @Override
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration restConfig) {
        ExposureConfiguration config = restConfig.getExposureConfiguration();
        config.forDomainType(WebsiteUser.class).withItemExposure((metadata, httpMethods) ->
          httpMethods.disable(HttpMethod.PATCH));
    }
}

6. Заключение

В этой статье мы рассмотрели, как мы можем настроить Spring Data REST для настройки методов HTTP, поддерживаемых по умолчанию в наших ресурсах.

Как обычно, примеры, использованные в этой статье, можно найти в нашемGitHub project.