Spring MVC REST API: вызов метода контроллера программно с заданным URL-адресом и телом запроса JSON

У меня есть общий REST API (разработанный с использованием Spring MVC), который принимает список запросов API в качестве тела запроса. Каждый запрос API в списке имеет собственный URL-адрес и тело запроса.

В реализации этого общего REST API мне нужно вызвать соответствующий метод контроллера Spring (в том же приложении) для каждого из этих индивидуальных запросов API (с их соответствующим URL-адресом и телом запроса). (Затем я объединю все эти отдельные ответы API и верну его одним большим ответом из общего REST API).

Я искал, но не понимаю, как программно вызывать Spring для выполнения каждого отдельного запроса API. В идеале я хотел бы получать ResponseEntity из каждого вызова вместо фактического ответа JSON.

(Больше информации: На том же сервере приложений, что и общий API, мне нужно преобразовать URL-адрес и тело запроса JSON для каждого отдельного API в аргументы метода контроллера. Мне также нужно взять URL-адрес, и Spring определит, какой метод контроллера вызывать сам.)

Любая помощь будет принята с благодарностью.

Спасибо,

Мэтт

Я считаю, что то, чего вы пытаетесь достичь, решается путем реализации архитектуры микроуслуг.

yogidilip 13.09.2018 21:09

Я согласен с подходом к использованию микросервисов, как я и делал это раньше. Мы создали агрегированный сервис, который представлял собой собственный развертываемый микросервис. У него была одна задача: после получения запроса он запускал 4-5 нижестоящих микросервисов параллельно и ждал их завершения (или он возвращал любую информацию, которую получил делал, если один или несколько из них истекло). Конечно, вы можете использовать RestTemplate для обратного вызова в то же приложение. Просто будьте осторожны с ограничениями ресурсов и убедитесь, что у вас достаточно потоков для обработки трафика tomcat.

Mike 13.09.2018 22:00

RestTemplate, насколько я понимаю, требует абсолютного пути и не может принимать относительный. Итак, что вы ставите для полного пути? localhost: <порт>? Кажется, далеко не идеально.

Matt 14.09.2018 02:24
2
3
576
1

Ответы 1

Ответ зависит от того, находятся ли отдельные URL-адреса, которые вы планируете вызывать, на одном сервере (доступны без использования сетевого вызова) или нет

  1. Если он находится на одном сервере приложений, создайте несколько потоков и вызовите отдельные методы, объедините ответ и отправьте его обратно.

  2. Если он не находится на одном сервере приложений, есть много Async Restclients, помимо собственного webclient / restTemplate Spring и т. д.

В моем случае это будет тот же сервер. Как вызвать отдельные методы с помощью Spring? Мне нужно перевести URL-адрес и тело запроса JSON в аргументы методов контроллера. Мне также нужно взять URL-адрес и заставить Spring определить, какой метод контроллера вызывать.

Matt 13.09.2018 21:43

Я не понимаю вашего вопроса, когда ваш метод контроллера оболочки был вызван spring, он получил в нем индивидуальное тело "запросов", URL-адрес и т. д. Верный? что мешает вам вызвать другой метод, передав эти requestbody и url в качестве аргументов? зачем вам снова нужен Spring MVC, он уже выполнил свою работу, и у вас есть все в вашем методе Java. Я думаю, вы запутались с архитектурой микросервисов с пограничным сервером / агрегатором. Помните, что пограничная служба обычно находится в сетевом вызове вдали от микросервисов.

so-random-dude 13.09.2018 23:19

У меня есть URL-адрес отдельного API, который мне следует вызвать. Как мне узнать, с каким контроллером это сопоставить? Spring обычно обрабатывает это отображение. И, чтобы вызвать метод контроллера, мне нужно преобразовать строку запроса JSON и URL-адрес в отдельные параметры пути, параметры запроса и объект тела запроса (для POST и PUT). Обычно с этим справляется Spring прямо из коробки. Мне было интересно, какие классы / методы предлагает Spring, которые я могу вызвать, чтобы определить вызываемый метод контроллера и аргументы, которые ему нужно передать.

Matt 14.09.2018 02:27

Можете ли вы опубликовать здесь образец "полного" запроса, чтобы мы могли лучше понять, в чем заключаются ваши требования.

so-random-dude 14.09.2018 17:55

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