Передача HttpServletRequest другому контроллеру API - PullRequest
1 голос
/ 21 апреля 2020

У меня есть контроллер, который получает HttpServletRequest с телом form-data с некоторыми key-value

Я хочу передать HttpServletRequest другому API. То, что другой контроллер API получает HttpServletRequest

До сих пор я пробовал это в своем классе обслуживания.

public void saveApi(HttpServletRequest request) throws Exception {
    System.out.println(request.getCode());
    RestTemplate restTemplate = new RestTemplate();         
    HttpServletRequest result = restTemplate.postForObject( "http:localhost:8080/save", request, HttpServletRequest .class);
}

В результате получается другой API java.lang.NullPointerException: null, другой API не сделал ' не получил мой пост.

Как это сделать? Является ли это возможным?

Другой сервис, например: GET метод, я использую RestTemplate для вызова другого API с некоторым параметром, он успешно выполняется.

UPDATE

ответ:

HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);

MultiValueMap<String, Object> form = new LinkedMultiValueMap<>();
form.add("name", request.getParameter("name"));
form.add("blabla", request.getParameter("blabla"));
form.add("blabla", request.getParameter("blabla"));

HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(form, httpHeaders);
restTemplate.postForEntity("http:localhost:8080/save", requestEntity, String.class);

1 Ответ

1 голос
/ 21 апреля 2020

Используя RestTemplate::postForObject и этот класс в целом, вы должны передать правильный request объект:

Параметр запроса может быть HttpEntity для добавления дополнительных Заголовки HTTP к запросу, то есть HttpEntity с телом и заголовками.

Обратите внимание, что HttpServletRequest расширяет ServletRequest.

  1. Извлеките тело, используя ServletRequest::getInputStream или ServletRequest::getReader. В случае multipart/form-data используйте HttpServletRequest::getParts
  2. Сериализуйте байты тела для объекта, который требуется для POST http:localhost:8080/save.
  3. Используйте объект и создайте new HttpEntity(T body).
  4. Передайте его как request в методе RestTemplate::postForObject.

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

...