我使用spring-mvc构建REST服务,我现在正在寻找的是一种从Spring MVC控制器内部向外部REST服务代理HTTP请求的方法。
我正在获取HttpServletRequest对象,并希望代理它,尽可能少地进行更改。对我来说最重要的是保留传入请求的所有标题和属性。
@RequestMapping('/gateway/**')
def proxy(HttpServletRequest httpRequest) {
...
}
我只是想使用RestTemplate向外部资源发送另一个HTTP请求,但我找不到复制 REQUEST ATTRIBUTES 的方法(这在我的案例中非常重要) )。
提前致谢!
答案 0 :(得分:2)
您可以使用Spring rest模板方法exchange将请求代理到第三方服务。
@RequestMapping("/proxy")
@ResponseBody
public String proxy(@RequestBody String body, HttpMethod method, HttpServletRequest request, HttpServletResponse response) throws URISyntaxException {
URI thirdPartyApi = new URI("http", null, "http://example.co", 8081, request.getRequestURI(), request.getQueryString(), null);
ResponseEntity<String> resp =
restTemplate.exchange(thirdPartyApi, method, new HttpEntity<String>(body), String.class);
return resp.getBody();
}
答案 1 :(得分:0)
我在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应该与此服务完全相同。
答案 2 :(得分:-1)
如果您考虑将API网关模式应用于微服务, 看看Netflix zuul,这是春季启动生态系统的一个很好的选择。提供了一个很好的例子here。