簡體   English   中英

RestController-將POST請求轉發到外部URL

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM