【问题标题】:RestController - Forward POST request to external URLRestController - 将 POST 请求转发到外部 URL
【发布时间】: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

【问题讨论】:

标签: java spring spring-boot spring-restcontroller


【解决方案1】:

这更多是 HTTP 规范的问题,而不是 Spring,在 Spring 规范中,服务器应该返回 307 重定向状态,表明客户端应该使用相同的方法遵循重定向并发布数据。

这通常是在野外避免的,因为如果您符合 W3.org 规范,即在新位置重新执行请求之前应提示客户端,则存在大量误用和摩擦的可能性。

另一种方法是让您的 Spring 端点充当代理,对目标位置进行 POST 调用,而不是发出任何形式的重定向。

307 Temporary Redirect (从HTTP/1.1开始) 这种情况下,应该用另一个URI重复请求,但以后的请求仍然可以使用原来的URI。2 与303相比,重发时请求方法不应该改变原始请求。例如,必须使用另一个 POST 请求重复一个 POST 请求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-01
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 2016-12-15
    • 2019-01-04
    • 2017-01-22
    • 1970-01-01
    相关资源
    最近更新 更多