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