gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:15:13 25 4
gpt4 key购买 nike

我正在寻找一种方法,如何转发已向 @RestController 类中的端点发出的 POST 请求,并将其转发到外部 URL,且正文和 header 保持不变(并从此 API 返回响应当然),是否可以通过使用一些 spring 功能来做到这一点?我找到的唯一解决方案是从 @RequestBody 中提取主体,从 HttpServletRequest 中提取 header ,并使用 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 .

最佳答案

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

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

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

307 Temporary Redirect (since HTTP/1.1) In this occasion, the request should be repeated with another URI, but future requests can still use the original URI.2 In contrast to 303, the request method should not be changed when reissuing the original request. For instance, a POST request must be repeated using another POST request.

关于java - RestController - 将 POST 请求转发到外部 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59049470/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com