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

6 Обязанности Контролеров (Весна В Качестве Примера)

В Любом Случае, Что Такое Контроллер? 🧐 Он действует как точка входа в наше серверное приложение… С тегом web dev, программирование, учебник, java.

В Любом Случае, Что Такое Контроллер? 🧐

Он действует как точка входа в наше серверное приложение из внешнего мира. Внешним миром Я имею в виду

  • Интерфейсные приложения, которые запускаются в браузерах.
  • Другие серверные приложения, работающие на серверах.

Как Это Делается? 👀

  • Контроллер определяет точки входа, с которыми клиенты из внешнего мира могут взаимодействовать, используя операции REST (GET, POST, DELETE и т.д.).
  • Запрос, который имеет соответствующие свойства, определенные определенной точкой входа, запустит функцию этой точки входа.
    • Затем функция вызывает функции бизнес-логики, которые будут выполнять некоторые действия и возвращать ответ клиенту.
@RestController  
public class GradeController {  
    @GetMapping("/grade/{id}")  
    public void getGradeById(@PathVariable String id){  
        // business stuff  
  }  
}

Приведенный выше пример описывает точку входа в baseUrl/grade/someGradeId , которая запускается при выполнении запроса GET с URL-адресом, соответствующим шаблону ( baseUrl/grade/1 например).

Каковы Обязанности Контролера? ☝ ️

Давайте перечислим их по порядку с момента получения запроса до момента возврата ответа.

1. Прослушивание HTTP-запросов 👂🏼

Какие типы URL/HTTP/Параметры запроса должны запускать эту функцию?

  • В приведенном выше примере мы говорим, что функция getGradeById будет запущена, когда будет сделан запрос GET на URL baeUrl/grade/{id} .

2⃣ Десериализация входных данных из входящего запроса ✍️

Превратите тело запроса в объекты Java. Преобразуйте параметры запроса в целые числа, строки и т.д…

@RestController  
public class GradeController {  
    @PostMapping("/grade/add")  
    public void getGradeById(@RequestBody Grade grade){  
        // business stuff  
  }  
}

Класс класса

class Grade{  
  Integer id;  
  String letter;  
  // getters and setters and constructors
}

В этом примере превратите тело запроса POST в объект оценки. Тело POST-запросов должно выглядеть примерно так:

{
    "id": "1",
    "letter": "A+"
}

3. Проверка десериализованных объектов 🧙

Мы можем указать правила проверки для входных данных, которые принимают наши контроллеры. Если правила не были соблюдены, будет выдана ошибка. Например, параметр id не должен быть отрицательным.

Мы можем выполнить проверку вручную

@RestController  
public class GradeController {  
    @PostMapping("/grade/add")  
    public void getGradeById(@RequestBody Grade grade) throws Exception{  
        if (grade.getId() < 0)
            throw new Exception();
  }  
}

Или мы можем использовать механизмы проверки Spring

Класс оценки с аннотацией проверки

class Grade{
  @Min(1) 
  Integer id;  
  String letter;
}

Контроллер с аннотацией для активации проверки

@PostMapping("/grade/add")  
public void getGradeById(@RequestBody @Validated Grade grade)  
{  
    // business stuff  
}

Узнайте больше о весенней проверке из моего другого сообщения в блоге. 👈

4. Вызов бизнес- логики 💼

Выполняется тело функции контроллера. В идеале он должен вызывать функции с сервисного уровня, на котором выполняется бизнес-код.

@RestController @RequiredArgsConstructor  
public class GradeController {  
    private final GradeService gradeService;  
  @GetMapping("/grade")  
    public void getGradeById()  
    {  
        gradeService.doThings();  
  }  
}

Обратите внимание на использование Lombok для написания более чистого кода. Ознакомьтесь с моим сообщением в блоге о Ломбоке здесь. Левый указательный палец

5 % от Сериализация выходных данных функции контроллера 🛠

Возвращаемое значение из функции is преобразуется в HTTP-ответ.

@RestController  
public class GradeController {  
    @GetMapping("/grade/add")  
    public APIResponse getGradeById()  
    {  
       // do things  
       return new APIResponse("success");  
  }  
}  
@AllArgsConstructor  
class APIResponse{  
    String message;  
}

Таким образом, ответом будет 200 со значением JSON, равным

{
  "message" : "success"
}

6️⃣ Обрабатывать исключения ⛔️

Если возникает исключение, которое не обрабатывается кодом бизнес-логики, контроллер преобразует его в осмысленный ответ.

Важное примечание ☢️

Как мы уже видели, контроллеру предстоит многое сделать! Очень важно не включать код бизнес-логики в контроллер.

Я много раз видел, как совершалась эта ошибка. Я также видел контроллеры с тысячами строк бизнес-кода.

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

Этот пост был вдохновлен этим удивительным постом.

Оригинал: “https://dev.to/jarjanazy/6-responsibilities-of-controllers-spring-as-an-example-4h3k”