【发布时间】:2020-03-21 18:51:45
【问题描述】:
我正在寻找一种方法,如何转发已向@RestController 类中的端点发出的 POST 请求,并将其转发到未触及正文和标头的外部 URL(当然还从该 API 返回响应),是吗可以通过使用一些弹簧功能来做到这一点吗?我发现的唯一解决方案是从@RequestBody 中提取正文和HttpServletRequest 中的标头,并使用RestTemplate 执行请求。有没有更简单的方法?
@RequestMapping("/**")
public ResponseEntity mirrorRest(@RequestBody(required = false) String body,
HttpMethod method, HttpServletRequest request, HttpServletResponse response)
throws URISyntaxException {
String requestUrl = request.getRequestURI();
URI uri = new URI("http", null, server, port, null, null, null);
uri = UriComponentsBuilder.fromUri(uri)
.path(requestUrl)
.query(request.getQueryString())
.build(true).toUri();
HttpHeaders headers = new HttpHeaders();
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
headers.set(headerName, request.getHeader(headerName));
}
HttpEntity<String> httpEntity = new HttpEntity<>(body, headers);
RestTemplate restTemplate = new RestTemplate();
try {
return restTemplate.exchange(uri, method, httpEntity, String.class);
} catch(HttpStatusCodeException e) {
return ResponseEntity.status(e.getRawStatusCode())
.headers(e.getResponseHeaders())
.body(e.getResponseBodyAsString());
}
}
以上代码取自answer。
【问题讨论】:
-
这个问题是关于MVC Controller的,我的是RestController,不过我还是会查的。
标签: java spring spring-boot spring-restcontroller