Контроллеры и маршруты
Контроллер — класс, который принимает HTTP-запросы и возвращает ответы. Каждый его метод обслуживает один маршрут — сочетание HTTP-метода (GET, POST, DELETE…) и адреса. Micronaut находит контроллеры сам: обработчик аннотаций ещё при компиляции записывает все маршруты, поэтому никакой регистрации не нужно.
Первый контроллер
Создайте файл вручную или командой mn create-controller com.example.Hello (она создаст и заготовку теста):
// src/main/java/com/example/HelloController.java
package com.example;
import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import io.micronaut.http.annotation.Produces;
@Controller("/hello")
public class HelloController {
@Get
@Produces(MediaType.TEXT_PLAIN)
public String index() {
return "Привет, Micronaut!";
}
}@Controller("/hello") задаёт общий адрес класса, @Get без аргумента — маршрут на сам этот адрес. @Produces(MediaType.TEXT_PLAIN) говорит, что ответ — обычный текст: по умолчанию Micronaut отвечает в JSON.
curl -i http://localhost:8080/helloHTTP/1.1 200 OK
content-type: text/plain
Привет, Micronaut!Части адреса
Фрагмент в фигурных скобках — переменная пути. Её значение приходит в параметр метода с тем же именем:
// src/main/java/com/example/HelloController.java
@Get("/{name}")
@Produces(MediaType.TEXT_PLAIN)
public String greet(String name) {
return "Привет, " + name + "!";
}Запрос curl http://localhost:8080/hello/Anna вернёт Привет, Anna!.
Контроллер статей
Начнём главный контроллер блога. Пока он возвращает текст, данные появятся в следующих уроках:
// src/main/java/com/example/ArticleController.java
package com.example;
import io.micronaut.http.HttpResponse;
import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Delete;
import io.micronaut.http.annotation.Get;
import io.micronaut.http.annotation.Produces;
@Controller("/articles")
@Produces(MediaType.TEXT_PLAIN)
public class ArticleController {
@Get
public String list() {
return "Все статьи";
}
@Get("/{id}")
public String show(Long id) {
return "Статья " + id;
}
@Delete("/{id}")
public HttpResponse<Void> delete(Long id) {
return HttpResponse.noContent();
}
}@Produces на классе действует на все методы. HttpResponse.noContent() возвращает пустой ответ со статусом 204. Проверка:
curl http://localhost:8080/articles/5
curl -i -X DELETE http://localhost:8080/articles/5Первая команда выведет Статья 5, вторая — HTTP/1.1 204 No Content.
Аннотации методов
| Аннотация | HTTP-метод | Типичное действие |
|---|---|---|
@Get | GET | Получить данные |
@Post | POST | Создать запись |
@Put | PUT | Заменить запись |
@Patch | PATCH | Изменить часть записи |
@Delete | DELETE | Удалить запись |
Все они лежат в пакете io.micronaut.http.annotation.
Частая ошибка
Если отправить запрос методом, для которого нет маршрута, Micronaut ответит 405 и подскажет, какие методы разрешены:
curl -i -X POST http://localhost:8080/articlesHTTP/1.1 405 Method Not Allowed
allow: HEAD,GET
{"_links":{"self":[{"href":"/articles","templated":false}]},"_embedded":{"errors":[{"message":"Method [POST] not allowed for URI [/articles]. Allowed methods: [HEAD, GET]"}]},"message":"Method Not Allowed"}Проверьте, что над методом стоит аннотация нужного HTTP-метода, а адрес в @Controller и в аннотации метода вместе дают тот путь, который вы вызываете.