У меня есть общий 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 определит, какой метод контроллера вызывать сам.)
Любая помощь будет принята с благодарностью.
Спасибо,
Мэтт
Я согласен с подходом к использованию микросервисов, как я и делал это раньше. Мы создали агрегированный сервис, который представлял собой собственный развертываемый микросервис. У него была одна задача: после получения запроса он запускал 4-5 нижестоящих микросервисов параллельно и ждал их завершения (или он возвращал любую информацию, которую получил делал, если один или несколько из них истекло). Конечно, вы можете использовать RestTemplate для обратного вызова в то же приложение. Просто будьте осторожны с ограничениями ресурсов и убедитесь, что у вас достаточно потоков для обработки трафика tomcat.
RestTemplate, насколько я понимаю, требует абсолютного пути и не может принимать относительный. Итак, что вы ставите для полного пути? localhost: <порт>? Кажется, далеко не идеально.
Ответ зависит от того, находятся ли отдельные URL-адреса, которые вы планируете вызывать, на одном сервере (доступны без использования сетевого вызова) или нет
Если он находится на одном сервере приложений, создайте несколько потоков и вызовите отдельные методы, объедините ответ и отправьте его обратно.
Если он не находится на одном сервере приложений, есть много Async Restclients, помимо собственного webclient / restTemplate Spring и т. д.
В моем случае это будет тот же сервер. Как вызвать отдельные методы с помощью Spring? Мне нужно перевести URL-адрес и тело запроса JSON в аргументы методов контроллера. Мне также нужно взять URL-адрес и заставить Spring определить, какой метод контроллера вызывать.
Я не понимаю вашего вопроса, когда ваш метод контроллера оболочки был вызван spring, он получил в нем индивидуальное тело "запросов", URL-адрес и т. д. Верный? что мешает вам вызвать другой метод, передав эти requestbody и url в качестве аргументов? зачем вам снова нужен Spring MVC, он уже выполнил свою работу, и у вас есть все в вашем методе Java. Я думаю, вы запутались с архитектурой микросервисов с пограничным сервером / агрегатором. Помните, что пограничная служба обычно находится в сетевом вызове вдали от микросервисов.
У меня есть URL-адрес отдельного API, который мне следует вызвать. Как мне узнать, с каким контроллером это сопоставить? Spring обычно обрабатывает это отображение. И, чтобы вызвать метод контроллера, мне нужно преобразовать строку запроса JSON и URL-адрес в отдельные параметры пути, параметры запроса и объект тела запроса (для POST и PUT). Обычно с этим справляется Spring прямо из коробки. Мне было интересно, какие классы / методы предлагает Spring, которые я могу вызвать, чтобы определить вызываемый метод контроллера и аргументы, которые ему нужно передать.
Можете ли вы опубликовать здесь образец "полного" запроса, чтобы мы могли лучше понять, в чем заключаются ваши требования.
Я считаю, что то, чего вы пытаетесь достичь, решается путем реализации архитектуры микроуслуг.