Направить запрос с точно таким же телом JSON - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть приложение SpringBoot, которое просто выступает в качестве посредника.Он получает запрос API в JSON и перенаправляет его на другой сервер S, вызывая API S с точно таким же телом.

Я изучал решения и наткнулся на решение, в котором использовались RestTemplate и MultiValueMap.Однако, поскольку тело json содержит объекты, а не простую строку, я считаю, что для решения проблемы нужно создать DTO с соответствующим POJO.

Могу ли я спросить, является ли приведенное выше единственное решение, или существуетпростой способ переслать запрос и получить ответ?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Даже сложные и вложенные объекты JSON могут быть взяты на карту с ключом как String и значением как Object.Я считаю, что вы должны просто использовать такую ​​карту в качестве тела запроса и перенести ее в другой API.

0 голосов
/ 13 декабря 2018

Сервер-посредник может предоставить конечную точку, которая принимает @RequestBody из Object и HttpServletRequest, а затем использует RestTemplate для пересылки на удаленный сервер.

Посредник

@RestController
@RequestMapping("/middleman")
public class MiddleManRestController {

    private RestTemplate restTemplate;

    @PostConstruct
    public void init() {
        this.restTemplate = new RestTemplate();
        this.restTemplate.setRequestFactory(new BufferingClientHttpRequestFactory(this.restTemplate.getRequestFactory()));
    }

    @RequestMapping(value = "/forward", method = RequestMethod.POST)
    public ResponseEntity<Object> forward(@RequestBody Object object, HttpServletRequest request) throws RestClientException {

        //setup the url and path
        final UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("Remote server URL").path("EnpointPath");

        //add query params from previous request
        addQueryParams(request, builder);

        //specify the method
        final RequestEntity.BodyBuilder requestBuilder = RequestEntity.method(HttpMethod.POST, builder.build().toUri());

        //add headers from previous request
        addHeaders(request, requestBuilder);

        RequestEntity<Object> requestEntity = requestBuilder.body(object);
        ParameterizedTypeReference<Object> returnType = new ParameterizedTypeReference<Object>() {};

        //forward to the remote server
        return this.restTemplate.exchange(requestEntity, returnType);
    }

    private void addHeaders(HttpServletRequest request, RequestEntity.BodyBuilder requestBuilder) {
        Enumeration<String> headerNames = request.getHeaderNames();
        while(headerNames.hasMoreElements()) {
            String headerName = headerNames.nextElement();
            String headerValue = request.getHeader(headerName);
            requestBuilder.header(headerName, headerValue);
        }
    }

    private void addQueryParams(HttpServletRequest request, UriComponentsBuilder builder) {
        final MultiValueMap<String, String> queryParams = new LinkedMultiValueMap<String, String>();
        Map<String, String[]> parameterMap = request.getParameterMap();
        if (parameterMap != null) {
            parameterMap.forEach((key, value) -> queryParams.addAll(key, Arrays.asList(value)));
        }
        builder.queryParams(queryParams);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...