Является ли хорошей практикой прямой вызов конечной точки REST (метода) из другой конечной точки REST того же контроллера?

У меня есть один класс контроллера Spring REST, который имеет несколько конечных точек. Является ли хорошей практикой прямой вызов метода конечной точки из другой конечной точки?

Я погуглил, но не нашел ответа на вопрос, что является хорошей практикой для решения этой проблемы.

@RestController
public class DataContoller {

    @GetMapping("/dataA/{param}")
    public ResponseEntity getDataA(@PathVariable String param) {
     // logic to fetch data A
     return ResponseEntity.ok("A");  
    }

    @GetMapping("/dataB/{param}")
    public ResponseEntity getDataB(@PathVariable String param) {
     ResponseEntity response = getDataA("test");
     String result = response.getBody();
     return ResponseEntity.ok("B" + result);  
    }

}

В принципе, это работает, поскольку это просто вызов метода из другого метода, но я хотел бы знать, является ли это хорошей практикой или нет. И если это не очень хорошая практика, то какой идеальный способ сделать это. Один из вариантов — использование RestTemplate. Это единственный вариант?

Нет, это не так. И я думаю, что это не имеет смысла. То, что вы пытаетесь сделать, означает, что у вас есть две конечные точки, которые делают одно и то же.

Jens 23.03.2019 23:16

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

Ganesh Pathak 23.03.2019 23:23

Вы должны обрабатывать это на сервисном уровне

Jens 23.03.2019 23:26

Если два метода должны получить одни и те же данные одним и тем же способом, извлеките метод fetchData, поместите его в службу, внедрите службу в свой контроллер и вызовите метод из двух методов контроллера. methodA не нуждается в ResponseEntity, созданном методом B. Им просто нужно получить одни и те же данные.

JB Nizet 23.03.2019 23:32
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
4
2 668
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это не так уж плохо, но и не хорошо.

Проблема в том, что прямой вызов getDataA("test") пропускает все, что обычно предшествует методу этого контроллера: проверки безопасности, валидацию, фильтрацию, регистрацию, сопоставление или любые другие виды манипуляций с данными.

Это вносит нестабильность: вы не уверены, какие данные поступают и откуда они на самом деле. Это пришло из моего внутреннего метода или это был HTTP-вызов?

Очень простой совет — иметь сервисный метод getDataA и вызывать его из обоих методов контроллера. Однако, как вы уже заметили, он не полностью заменяет HTTP-запрос.

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

Ganesh Pathak 23.03.2019 23:44

Я согласен с тем, что вы говорите в середине вашего комментария, но я не согласен с этой частью skips everything that normally precedes this controller's method: security checks, validation, filtering, logging, mapping, or any other kind of data manipulation. В идеале контроллеры должны обрабатывать только делегирование HTTP-запроса на уровень службы и не выполнять никаких других функций. Есть и другие компоненты, которые служат этой цели.

akortex 24.03.2019 00:03

@Aris_Kortex мы говорим об одном и том же. Под «всем» я подразумеваю «любой другой компонент» — я категорически против возложения ответственности за безопасность/фильтрацию/и т. д. на контроллер.

Andrew Tobilko 24.03.2019 00:19

Другие вопросы по теме