У меня есть приложение Spring MVC, которое принимает запросы из пользовательского интерфейса (multiform и json), и оно должно отправлять эти данные в другой микросервис с помощью Spring RestTemplate. Копирование запроса в виде строки в RestTemplate отлично работает в случае типа содержимого json, но, похоже, не работает в случае multipart.
Вот мой пример кода
Контроллер Spring MVC:
@Controller
public class MvcController {
@RequestMapping(value = "/api/microservice", method = RequestMethod.POST)
public ResponseEntity<?> callMicroservice(HttpServletRequest request) throws Exception {
RestTemplate rest = new RestTemplate();
String payload = IOUtils.toString(request.getReader());
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", request.getHeader("Content-Type"));
HttpEntity<String> requestEntity = new HttpEntity<String>(payload, headers);
return rest.exchange("https://remote.micrservice.com/api/backendservice", HttpMethod.POST, requestEntity, String.class);
}
}
А вот как выглядит бэкэнд-микросервис
@Controller
public class RestController {
@RequestMapping(value = "/api/backendservice", method = RequestMethod.POST)
public @ResponseBody Object createService(@RequestParam(value = "jsondata") String jsondata,
@RequestParam(value = "email") String email,@RequestParam(value = "xsltFile", required = false) MultipartFile xsltFile,
HttpServletRequest request) {
// process jsondata
// process xsltFile
// send response
}
}
Если вы посмотрите на MvcController, я отправляю полезную нагрузку в виде строки
String payload = IOUtils.toString(request.getReader());
вместо этого, как я могу отправить данные запроса, как для запроса RestTemplate, чтобы он работал как для строковых, так и для составных частей. Если вы посмотрите на подпись MvcController, я не знаю, какие данные пользователь будет отправлять в то время, когда я не знаю, что будет подписью микросервиса. Мне просто нужно передать данные между запросом MvcController и RestTemplate.
@RequestMapping(value = "/api/microservice", method = RequestMethod.POST)
public ResponseEntity<?> callMicroservice(HttpServletRequest request) throws Exception {
RestTemplate rest = new RestTemplate();
LinkedMultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
map.add("jsondata", yourjsondata);
map.add("email", youremail);
map.add("xsltFile", new ClassPathResource(file));
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<LinkedMultiValueMap<String, Object>> requestEntity = new HttpEntity<LinkedMultiValueMap<String, Object>>(
map, headers);
ResponseEntity<String > result = template.get().exchange(
contextPath.get() + path, HttpMethod.POST, requestEntity,
String.class);
}
Спасибо, Малыш, за твой ответ. Но проблема в том, что я не знаю, что входит в запрос и что также реализовано в удаленном микросервисе. Если вы посмотрите на MvcController, подпись метода просто содержит запрос. Подумайте о прокси Zuul, где он просто действует как прокси и маршрутизирует данные от источника к цели. Я хотел бы использовать аналогичный подход здесь, где MvcController, просто прокси-сервер запроса удаленной микрослужбе. Надеюсь, это проясняет мои требования.