[英]RestController - Forward POST request to external URL
我正在尋找一種方法來轉發已發給@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());
}
}
上面的代碼就是從這個答案中獲取的 。
與Spring相比,這更多是HTTP規范的問題,在Spring中,服務器將返回307重定向狀態,這表明客戶端應使用相同的方法遵循重定向並發布數據。
通常會在野外避免這種情況,因為存在很多潛在的誤用和摩擦,如果您符合W3.org規范,該規范指出應在新位置重新執行請求之前提示客戶端。
一種替代方法是讓您的Spring終結點充當代理,而不是發出任何形式的重定向來對目標位置進行POST調用。
307臨時重定向(自HTTP / 1.1起)在這種情況下,應使用另一個URI重復請求,但是以后的請求仍可以使用原始URI。2與303相比,重新發出原始請求時,不應更改請求方法。 例如,必須使用另一個POST請求重復POST請求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.