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

Как создать REST API в quarks?

Я, наконец, решил опубликовать свою первую статью, и я пытаюсь изучить кварки. Итак, я пишу здесь… С пометкой java, quartus, tutorial.

Я, наконец, решил опубликовать свою первую статью, и я пытаюсь изучить кварки. Итак, я пишу эту статью для нашего первого применения сверхзвуковых кварков. Мы разработаем приложение RESTful с использованием JAX-RS для приложения To Do.

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

Что такое кварки?

Quarkus – это собственный Java-фреймворк Kubernetes, разработанный специально для GraalVM и HotSpot. Цель Quarks – сделать Java ведущей платформой в Kubernetes и бессерверных средах, предлагая разработчикам унифицированную реактивную и императивную модель программирования для оптимального решения более широкого спектра архитектур распределенных приложений.

Почему кварки?

Всякий раз, когда кто-то думает о разработке java. Они думают, что приложение будет занимать огромную память, и его будет трудно разрабатывать по сравнению с его аналогами. Но quarks, давайте разработаем высокопроизводительные приложения, которые занимают очень мало места и с которыми легко работать благодаря таким функциям, как live reload. Кроме того, широкий спектр расширений и библиотек, предоставляемых командой и сообществом quark u, делает создание приложения quarks намного проще и увлекательнее (да, java может быть забавным 😅 ).

пожалуйста, перейдите по этой ссылке для получения дополнительной информации: https://quarkus.io/

резюме:

  • меньшее использование памяти
  • быстрое время запуска
  • живая перезагрузка из коробки
  • использует стандартные спецификации java ee. так что, если вы уже знакомы с jakarta ee или даже с spring, вам хорошо идти
  • Quarks не использует reflection API.

Для настройки среды разработки

вам понадобится:

  • JDK 8 или 11 с настроенным JAVA_HOME
  • Graal VM (если вы хотите создать собственный образ)
  • Apache Maven или Gradle
  • IDE (я предпочитаю intellij Idea)

Приступая к работе

Самый простой способ – перейти к https://code .quarkus.io/ и загрузите zip-файл исходного приложения с конфигурацией по умолчанию и эти библиотеки

  • Простое внедрение JAX-RS
  • RestEasy Json

Это ваш выбор – использовать maven или gradle. Я буду использовать gradle.

Структура проекта будет выглядеть следующим образом:

quarkus-project/                    
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── README.md
├── settings.gradle
└── src
    ├── main
    │   ├── docker
    │   │   ├── Dockerfile.jvm
    │   │   └── Dockerfile.native
    │   ├── java
    │   │   └── org
    │   │       └── quarkus
    │   │           ├── ExampleResource.java
    │   └── resources
    │       ├── application.properties
    │       └── META-INF
    │           └── resources
    │               └── index.html
    ├── native-test
    │   └── java
    │       └── org
    │           └── quarkus
    │               └── NativeToDoResourceIT.java
    └── test
        └── java
            └── org
                └── quarkus
                    └── ToDoResourceTest.java
  • В ExampleResource.java содержит конечную точку REST.
  • Папка docker содержит два файла для создания приложения в качестве контейнера. Dockerfile.jvm для запуска приложения на JVM и Dockerfile.нативный для создания нативного приложения.
  • Тест и native-test для тестирования JVM и собственное приложение
  • Статические ресурсы помещаются в папку resources , например index.html .
  • application.properties – это файл yaml, используемый для настройки. например, определение источника данных и настройка базы данных.

Создание нашего ToDo API

Для простоты я не буду использовать базу данных в этой статье и, возможно, покажу, как ее использовать в следующей статье.

Вы можете попробовать запустить начальный проект с помощью

./gradlew quarkusDev
./mvnw quarkus:dev

Это позволит запустить приложение в режиме разработки, который обеспечивает горячую перезагрузку. таким образом, любое изменение в коде мгновенно становится видимым без перезапуска приложения. Продолжайте и попробуйте это, просто изменив некоторый текст инструкции return.

Первоначальный проект содержит Пример ресурса простая конечная точка hello, которая возвращает hello. Замените это на Чтобы сделать Resource и добавить этот код.

ToDoResource.java

Это содержит 6 конечных точек для основных операций CRUD:

  • GET /api/todo возвращает все задачи
  • GET /api/todo/{id} возвращает задачу с заданным идентификатором
  • POST /api/todo с телом объекта ToDo json для создания новой задачи
  • POST /api/todo с телом строки задачи для создания новой задачи
  • ИСПРАВЛЕНИЕ /api/todo/status/{id} для обозначения выполненной или не выполненной задачи- завершенный
  • УДАЛИТЬ /api/todo/{id} удаляет задачу с заданным идентификатором

@Path Аннотация задает uri для конечной точки. Он используется для определения базового URL-адреса, когда он объявлен в верхней части ресурса, и указывает uri для конкретного API, если указан через функцию. например, api/to do в данном случае является базовым URL, а status/{id} – URL API изменения статуса.

@Products Аннотация указывает, какой тип результата обслуживается API. например, для JSON, обычного текста или HTML.

@Consumes Аннотация указывает, какой тип тела используется API. например, для JSON, обычного текста или HTML.

@@Inject Аннотация используется для введения экземпляра ToDoService с использованием CDI. Это позволяет нам просто использовать нужную нам зависимость/объект, не беспокоясь о его создании и жизненном цикле, поскольку он управляется системой внедрения контекста и зависимостей.

package org.quarkus;

import javax.inject.Inject;
import javax.validation.Valid;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

@Path("/api/todo")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class ToDoResource {

    @Inject
    ToDoService service;

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public Response newTask(@Valid ToDo task) {
        try {
            if (task == null) {
                return Response.status(400).entity("Task not provided").build();
            }
            return Response.ok(service.addTask(task)).build();
        }
        catch (Exception e){
            return Response.serverError().build();
        }
    }

    @POST
    @Consumes(MediaType.TEXT_PLAIN)
    public Response newTaskString(@Valid String task) {
        try {
            if (task == null) {
                return Response.status(400).entity("Task not provided").build();
            }
            return Response.ok(service.addTask(task)).build();
        }
        catch (Exception e){
            return Response.serverError().build();
        }
    }

    @GET
    public Response allTasks(){
        return Response.ok(service.allTasks()).build();
    }

    @GET
    @Path("/{id}")
    public Response task(@PathParam("id") String id){
        return Response.ok(service.getTask(id)).build();
    }

    @PATCH
    @Path("status/{id}")
    public Response changeStatus(@PathParam("id") String id){
        return Response.ok(service.changeStatus(id)).build();
    }

    @DELETE
    @Path("/{id}")
    public Response delete(@PathParam("id") String id){
        return Response.ok(service.delete(id)).build();
    }
}


ToDo.java

Это наш POJO с конструкторами для инициализации объектов.

package org.quarkus;

import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.Future;
import javax.validation.constraints.NotNull;
import java.util.Date;
import java.util.UUID;

public class ToDo {
    @NotNull
    public String id;

    @NotNull
    public String task;

    @NotNull
    public boolean isComplete;

    @NotNull
    public Date time;

    public ToDo(String task, Date time) {
        this.id = UUID.randomUUID().toString();
        this.task = task;
        this.isComplete = false;
        this.time = time;
    }

    public ToDo(String task, boolean isComplete, Date time) {
        this.id = UUID.randomUUID().toString();
        this.task = task;
        this.isComplete = isComplete;
        this.time = time;
    }

    @Override
    public String toString() {
        return "ToDo{" +
                "id='" + id + '\'' +
                ", task='" + task + '\'' +
                ", isComplete=" + isComplete +
                ", time=" + time +
                '}';
    }
}

TodoService.java

Этот класс содержит логику приложения. Это Область применения , что означает, что в течение срока службы приложения создается только один экземпляр этого класса, и один и тот же экземпляр вводится и повторно используется везде, где это требуется системой CDI.

package org.quarkus;

import javax.enterprise.context.ApplicationScoped;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;

@ApplicationScoped
public class ToDoService {
    ArrayList list = new ArrayList<>();

    public ToDoService(){

    }

    public boolean addTask(String task){
        ToDo toDo = new ToDo(task, false, new Date());
        return list.add(toDo);
    }

    public boolean addTask(ToDo task){
        return list.add(task);
    }

    public List allTasks(){
        return list;
    }

    public ToDo getTask(String id){
        Optional item = list.stream().filter(toDo -> toDo.id.equals(id)).findFirst();
        return item.orElse(null);
    }

    public ToDo changeStatus(String id){
        ToDo todo = getTask(id);
        todo.isComplete = !todo.isComplete;
        return todo;
    }

    public boolean delete(String id){
        return list.remove(getTask(id));
    }
}

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

dhruv@dhruv-laptop:~/Programs/javaPrograms/to_do$ ./gradlew quarkusDev
Starting a Gradle Daemon (subsequent builds will be faster)

> Task :quarkusDev
Listening for transport dt_socket at address: 5005
__  ____  __  _____   ___  __ ____  ______ 
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ 
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/   
2020-07-02 19:03:56,518 INFO  [io.quarkus] (Quarkus Main Thread) to_do 1.0.0-SNAPSHOT on JVM (powered by Quarkus 1.5.2.Final) started in 6.566s. Listening on: http://0.0.0.0:8080
2020-07-02 19:03:56,578 INFO  [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
2020-07-02 19:03:56,579 INFO  [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, resteasy, resteasy-jsonb]
<=========----> 75% EXECUTING [41s]
> :quarkusDev

Если вы присмотритесь, вы увидите, что он также сообщает обо всех установленных функциях, таких как cdi, resteasy, resteasy-json b в 3-й строке после баннера quarkus.

Создание собственного исполняемого файла

Используйте приведенную ниже команду для создания собственного исполняемого файла

      ./mvnw package -Pnative
      ./gradlew build -Dquarkus.package.type=native

В результате сборки будет создан target/{package_name}-1.0-SNAPSHOT-runner. Вы можете запустить его с помощью: ./target/{package_name}-1.0-SNAPSHOT-runner в Linux.

Для получения более подробной информации о правильной настройке перейдите по ссылке this

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

Вы можете найти исходный код здесь . звездное репо, если вам это нравится.

Надеюсь, вам понравилась эта статья, и она помогла вам узнать что-то новое. Это мой первый раз, когда я пишу о кварках и размещаю статью/блог в Интернете. Не стесняйтесь, дайте мне знать, если что-то не так в комментариях, также сообщите в комментариях, понравилось ли вам это. Вы можете связаться со мной через twitter |/или сеть LinkedIn

Спасибо, что прочитали эту статью. Желаю удачи в изучении кварков.

Оригинал: “https://dev.to/dhruvgarg79/how-to-create-rest-api-in-quarkus-n2n”