You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将HttpServletResponse的Body提取为字符串?

提取HttpServletResponse的Body为字符串(无需过滤器)

由于你的场景是将HttpServletResponse作为数据容器而非实际发送HTTP响应,无法使用过滤器捕获内容,最直接的方案是通过自定义HttpServletResponseWrapper替换输出流,缓存所有写入的内容,最终转换为字符串。

实现步骤

  1. 编写响应包装类,将输出流替换为ByteArrayOutputStream以缓存内容
import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;

public class CapturingResponseWrapper extends HttpServletResponseWrapper {
    private final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    private PrintWriter writer;

    public CapturingResponseWrapper(HttpServletResponse response) {
        super(response);
    }

    @Override
    public ServletOutputStream getOutputStream() throws IOException {
        return new ServletOutputStream() {
            @Override
            public boolean isReady() {
                return true;
            }

            @Override
            public void setWriteListener(WriteListener writeListener) {}

            @Override
            public void write(int b) throws IOException {
                byteArrayOutputStream.write(b);
            }
        };
    }

    @Override
    public PrintWriter getWriter() throws IOException {
        if (writer == null) {
            writer = new PrintWriter(new StringWriter() {
                @Override
                public void write(String str, int off, int len) {
                    try {
                        byteArrayOutputStream.write(str.getBytes(getCharacterEncoding()), off, len);
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }
            });
        }
        return writer;
    }

    public String getCapturedBody() {
        if (writer != null) {
            writer.flush();
        }
        try {
            return byteArrayOutputStream.toString(getCharacterEncoding());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
  1. 在业务代码中使用包装类捕获Body
// 包装原始HttpServletResponse
CapturingResponseWrapper responseWrapper = new CapturingResponseWrapper(originalResponse);

// 执行原本写入响应的逻辑(比如业务代码中调用response.getWriter()/getOutputStream()写入内容)
responseWrapper.getWriter().write("示例响应内容");
responseWrapper.getWriter().flush();

// 提取Body字符串
String responseBody = responseWrapper.getCapturedBody();

注意事项

  • 务必调用flush()确保所有写入内容被缓存到ByteArrayOutputStream中
  • 使用getCharacterEncoding()保证字符串编码与原响应一致,避免乱码
  • 该方案无需依赖过滤器,直接在代码中包装响应对象,完全适配你将Response作为数据容器的改造场景

内容的提问来源于stack exchange,提问作者Cube.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 07:57:17