我正在使用spring-mvc构建REST服务,而我现在正在寻找的是一种从Spring MVC Controller 内部将HTTP请求代理到外部REST服务的方法。

我正在获取HttpServletRequest对象,并希望代理它进行尽可能少的更改。对我来说至关重要的是保持传入请求的所有 header 和属性不变。

@RequestMapping('/gateway/**')
def proxy(HttpServletRequest httpRequest) {
    ...
}

我只是尝试使用RestTemplate向外部资源发送另一个HTTP请求,但未能找到一种方法来复制请求属性(在我的情况下这很重要)。

提前致谢!

最佳答案

我在Kotlin中编写了此ProxyController方法,将所有传入请求转发到远程服务(由主机和端口定义),如下所示:

@RequestMapping("/**")
fun proxy(requestEntity: RequestEntity<Any>, @RequestParam params: HashMap<String, String>): ResponseEntity<Any> {
    val remoteService = URI.create("http://remote.service")
    val uri = requestEntity.url.run {
        URI(scheme, userInfo, remoteService.host, remoteService.port, path, query, fragment)
    }

    val forward = RequestEntity(
        requestEntity.body, requestEntity.headers,
        requestEntity.method, uri
    )

    return restTemplate.exchange(forward)
}


请注意,远程服务的API应该与此服务完全相同。

10-07 20:34