Рубрики
Без рубрики

Веб-службы в Java 2 – Предоставляют ресурсы REST

Привет, с возвращением. Надеюсь, все, что мы сделали в части 1, сработало для вас. Если что-то не нравилось… С пометкой java, новички, api.

Привет, с возвращением. Надеюсь, все, что мы сделали в части 1, сработало для вас. Если что-то не так, пожалуйста, оставьте нам комментарий, и мы рассмотрим это как можно скорее.

В этом посте мы узнаем, как выглядит обработчик REST в Java и что мы можем сделать, чтобы сообщить нашему серверу, что он существует.

Как структурированы ресурсы REST и как мы будем получать к ним доступ?

В целом, общий подход к структурированию приложений Java заключается в группировании действий в логические группы. Например. все вызовы, работающие с пользователями в качестве цели, будут сгруппированы в класс с именем UsersController . В общем, наиболее распространенные методы HTTP-запроса связаны с конкретным типом действия:

  • ПОЛУЧЕНИЕ – извлечение данных
  • Данные ПОСЛЕ создания
  • ПОМЕСТИТЬ/ИСПРАВИТЬ – обновить данные
  • УДАЛИТЬ – уничтожить данные

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

Здесь мы можем посмотреть на небольшой пример контроллера:

    @Path("")
    public class ExampleResource {
        @GET
            @Produces(MediaType.TEXT_HTML)
        public String hello() {
            return "

Hello World

"; } @GET @Path("test") @Produces(MediaType.APPLICATION_JSON) public String test() { return "{ \"Hello\": \"World\"}"; } }

Путь @Path Аннотация сообщает серверу базовый путь, по которому работает контроллер. Эта аннотация также может быть помещена поверх метода обработчика. Путь, который прослушивает этот метод, затем будет создан путем соединения строк из аннотации к классу и к методу с помощью /

Каждый метод, который должен обрабатывать запрос, также получит аннотацию с именем HTTP-метода, который он поддерживает. В этом небольшом примере наши два метода поддерживают только GET.

Сообщите серверу, чего мы хотим и что мы даем

С помощью @Products и @Потребители мы сообщаем серверу, какой тип контента требуется нашему методу и какой тип контента он вернет обратно потребителю. В Javax.ws.rs спецификация, предусмотрено перечисление, которое называется MediaType. Он содержит все типы носителей, поддерживаемые Java. Чтобы обслуживать HTML, мы передадим MediaType. TEXT_HTML к аннотации @Создает . Если мы хотим получить некоторый JSON из запроса, мы просто сообщаем серверу в аннотации @Consumes с типом носителя . APPLICATION_JSON .

Передайте ввод с запросом

Это хорошо и все такое, но как, черт возьми, мы можем проверить, являются ли входные данные из нашего запроса классными?

Ничего особенного. Мы просто создадим для этого класс:

    public class MyFancyInput 
        private String username;
        private Integer age;
        private Boolean acceptTOS;

        public String getUsername() {
            return this.username;
        }

        public void setUsername(String username) {
            this.username = username;
        }

        public Integer getAge() {
            return this.age;
        }

        public void setAge(Integer age) {
            this.age = age;
        }

        public Boolean getAcceptTOS() {
            return this.acceptTOS;
        }

        public void setAcceptTOS(Boolean acceptTOS) {
            this.acceptTOS = acceptTOS;
        }
    }

Объект тела запроса – это просто обычный Java POJO. Все свойства должны иметь метод получения и метод установки, поскольку десериализация попытается вызвать их. Чтобы гарантировать, что нулевое поле не нарушит работу нашего сервиса, мы используем только непримитивные типы данных. Это происходит потому, что логическое значение например, не поддерживает нулевые типы но Логическое значение делает.

Когда вы введете класс, мы просто сообщим нашей операции, что мы хотим, чтобы это было параметром:

    @Path("")
    public class ExampleResource {
        @GET
            @Produces(MediaType.TEXT_HTML)
        public String hello() {
            return "

Hello World

"; } @GET @Path("test") @Produces(MediaType.APPLICATION_JSON) public String test() { return "{ \"Hello\": \"World\"}"; } @POST @Path("test") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public MyFancyInput getInput(@NotNull MyFancyInput input) { return input; } }

Здесь мы просто получаем входные данные и снова возвращаем их клиенту. С помощью аннотации @NotNull мы сообщаем серверу, что параметр для этого метода является обязательным и не может быть нулевым.

Если входные данные поступают из специального места в запросе, мы просто аннотируем их нужной аннотацией. Доступными аннотациями являются:

  • @BeanParam
  • @CookieParam
  • @FormParam
  • @PathParam
  • @QueryParam
  • @MatrixParam

Свяжите все это воедино

У нас есть ресурс, у нас есть структура данных, и если вы выполнили часть 1, у вас также есть сервер. Теперь нам нужно соединить все это:

В нашем основном классе мы просто добавляем что-то в наш ResourceConfig:

    // Holds all the resources we want to register (currently, there's nothing to do)
    ResourceConfig resourceConfig = new ResourceConfig();
    resourceConfig.register(ExampleResource.class); // our rest resource
    // the parser for JSON and XML request bodies
    resourceConfig.register(JacksonFeature.class);

Теперь, когда мы запускаем наш сервер, мы должны иметь возможность получить доступ к ресурсам, которые мы только что создали по адресу localhost:8080/ и далее локальный хост:8080/тест

После всего этого структура нашего проекта должна выглядеть примерно так:

src
- main
    - java
        - Main.java
        - ExampleResource.java
        - MyFancyInput.java
- test

Я надеюсь, вам было весело, и все получилось у вас. Хорошего вам дня!:D

Оригинал: “https://dev.to/funcke/web-services-in-java-2-provide-rest-resources-546p”