如何将 HTTPServletResponse 转换为 HttpEntity?

Posted

技术标签:

【中文标题】如何将 HTTPServletResponse 转换为 HttpEntity?【英文标题】:how to convert HTTPServletResponse into HttpEntity? 【发布时间】:2016-05-19 13:50:38 【问题描述】:

在我的项目中,我有多个 API(使用 Spring REST API 实现)。 现在我有这个要求,我必须在将响应发送到客户端之前以特定方式操作响应,并且在每个 API 方法中更改它似乎不是一个好的选择。

我能想到的唯一解决方案是使用 servlet.Filter(通过扩展过滤器类)

 @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException 
> chain.doFilter(req, res);

然后写我的逻辑

chain.doFilter(req, res);

但我正在努力将 ServletResponse 或 HTTPServletResponse 转换为 HttpEntity。

请帮助我如何实现这一目标?有没有更好的方法?

谢谢

更新

@jny 解决方案帮助了我。

小代码 sn-p 显示它是如何工作的。

@ControllerAdvice(basePackages =  "com.test.controller" )   // package where it will look for the controllers.
public class ResponseFilter implements ResponseBodyAdvice<Object> 

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
            Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
            ServerHttpResponse response) 
        //here you can manipulate the body the way you want.
        return body;
    

重要的是您的控制器应该使用 @ResponseBody

进行注释

【问题讨论】:

你能补充一些细节吗?在您提出的过滤器之前,响应是什么样的?你希望它看起来像什么? 【参考方案1】:

这取决于你到底需要什么。 如果您需要更改响应的正文, 如果您使用Spring 4.1 或更高版本,则可以使用ResponseBodyAdvice 来操作响应的正文。

如果您需要过滤某些字段,还有其他可用选项。 来自文档:

实现可以直接注册 RequestMappingHandlerAdapter 和 ExceptionHandlerExceptionResolver 或 更有可能用 @ControllerAdvice 注释,在这种情况下,他们会 被两者自动检测到。

【讨论】:

正如我从文档中了解到的那样,ResponseBodyAdvice 需要从方法本身(在返回响应之前)调用,这实际上是很多工作。我正在考虑以某种方式在过滤器中处理这个逻辑。我的动机是读取响应 boda 操纵它并将其写回作为响应。 更新了答案以表明您不需要从方法中调用它 正是我想要的。谢谢。【参考方案2】:

这可能会为您指明正确的方向:Spring MVC: How to modify json response sent from controller

它涉及在调用 doFilter 之前包装 ServletResponse 并使用自定义的 ServletOutputStream 允许在响应数据正常关闭后对其进行操作。不涉及 HttpEntity。

【讨论】:

以上是关于如何将 HTTPServletResponse 转换为 HttpEntity?的主要内容,如果未能解决你的问题,请参考以下文章

如何配置 Tomcat 在调用 HttpServletResponse.encodeURL() 时不将会话 ID 编码到 URL 中

如何从 HttpServletResponse 获取 HTML 内容?

将 InputStream 写入 HttpServletResponse

如何使用 ktor 客户端设置 HttpServletResponse 的主体

我可以在将数据提交到 HttpServletResponse 后发送错误消息吗

如何获取HttpServletResponse里面的内容