Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Контроллеры и маршруты

Контроллер — класс, который принимает 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/hello
HTTP/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-методТипичное действие
@GetGETПолучить данные
@PostPOSTСоздать запись
@PutPUTЗаменить запись
@PatchPATCHИзменить часть записи
@DeleteDELETEУдалить запись

Все они лежат в пакете io.micronaut.http.annotation.

Частая ошибка

Если отправить запрос методом, для которого нет маршрута, Micronaut ответит 405 и подскажет, какие методы разрешены:

curl -i -X POST http://localhost:8080/articles
HTTP/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 и в аннотации метода вместе дают тот путь, который вы вызываете.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.