Как передать данные запроса из контроллера MVC Spring в Spring RestTemplate - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть приложение 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.

1 Ответ

0 голосов
/ 17 ноября 2018
@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);

}
...