当前位置: 首页 > 知识库问答 >
问题:

在Spring MVC控制器中代理HttpServletRequest的最简单方法

贡正诚
2023-03-14

我正在使用SpringMVC构建REST服务,现在我正在寻找一种从SpringMVC控制器内部将HTTP请求代理到外部REST服务的方法。

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

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

我试图简单地发送另一个HTTP请求到外部资源使用RestTem板,但我未能找到复制请求属性的方法(这在我的情况下非常重要)。

提前谢谢!

共有3个答案

施洛城
2023-03-14

如果您考虑将API网关模式应用于微服务,请查看Netflixzuul,这是Spring引导生态系统中的一个很好的替代方案。这里提供了一个很好的例子。

郝峰
2023-03-14

您可以使用SpringREST模板方法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();
}

什么是rest模板。的exchange()方法?

朱昊乾
2023-03-14

我在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应该与此服务完全相同。

 类似资料:
  • 我遇到了一种情况,在处理请求之前,我必须更新它。基本上,我必须用一个可以随时间变化的属性来更新请求。要求消费者随请求一起发送属性是不实际的..所以,我觉得唯一的办法就是..在处理请求之前,更新控制器方法中的请求.. 到目前为止,控制器方法中使用了HttpServletRequest。然后将请求读取为流,然后将其转换为json字符串进行处理。我正在考虑用@RequestBody替换它,并将请求读入p

  • 假设您希望对迭代器的元素进行流式处理;让我们使用一个的具体示例,它实现了。 给定,比方说: 在给定的情况下,JDK中是否有一个工厂方法返回?

  • 我正在开发一个Spring应用程序,并在HandlerInterceptorAdapter的预处理()方法中对用户进行身份验证,如果用户进行了身份验证,我将如下设置请求属性: 如果用户未通过身份验证,我是这样设置的 然后在稍后的控制器方法中,我用HttpServletRequest检索用户,如下所示: 问题是我需要在每个控制器方法中接收HttpServletRequest,以检查用户是否经过身份验

  • 我有过 我通过这种方式传递profileJson: 但是我的配置文件Json对象具有所有空字段。我应该怎么做才能让Spring解析我的json?

  • 问题内容: 在JavaScript中实现单例模式的最简单/最干净的方法是什么? 问题答案: 我认为最简单的方法是声明一个简单的对象文字: 如果您希望单例实例上有私人成员,则可以执行以下操作: 这就是所谓的模块模式,它基本上可以让你来封装对象私有成员,通过采取利用的优势关闭。 更新: 我想补充一点,如果要防止修改单例对象,可以使用ES5 方法冻结它。 这将使对象不可变,从而防止对其结构和值进行任何修