RestController - 将 POST 请求转发到外部 URL

Posted

技术标签:

【中文标题】RestController - 将 POST 请求转发到外部 URL【英文标题】:RestController - Forward POST request to external 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。

【问题讨论】:

你的意思是***.com/questions/17955777/…? 这个问题是关于MVC Controller的,我的是RestController,不过我还是会查的。 【参考方案1】:

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

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

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

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

【讨论】:

以上是关于RestController - 将 POST 请求转发到外部 URL的主要内容,如果未能解决你的问题,请参考以下文章

当返回类型为 void 时,为啥 Spring RestController POST 方法返回 200 而不是 204?

Spring Security Config 可能有啥问题?获取与 POST

@getMapping和@postMapping,@RestController 区别

使用千分尺将 POST /** 请求 URL 解析为完整请求 URL

将 JSON POST 请求从一个 REST API 转发到另一个

Spring Boot 注释