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

如何在Spring Boot中获得完整的HttpServletResponse响应体?

翟理
2023-03-14

我想获取用于登录自定义拦截器的HttpServletACK返回内容。开发环境是Spring Boot 1.5.6Java8 Embeded Tomcat 8.0.35,返回内容是RESTful接口json string。这是我获取超文本传输协议响应内容的代码:

 /**
 * get Response return json content
 *
 * @param response
 * @return
 * @throws IOException
 * @throws NoSuchFieldException
 * @throws IllegalAccessException
 */
public String getResponseContent(HttpServletResponse response) throws IOException, NoSuchFieldException, IllegalAccessException {
    String responseContent = null;
    CoyoteOutputStream outputStream = (CoyoteOutputStream) response.getOutputStream();
    Class<CoyoteOutputStream> coyoteOutputStreamClass = CoyoteOutputStream.class;
    Field obField = coyoteOutputStreamClass.getDeclaredField("ob");
    if (obField.getType().toString().endsWith("OutputBuffer")) {
        obField.setAccessible(true);
        org.apache.catalina.connector.OutputBuffer outputBuffer = (org.apache.catalina.connector.OutputBuffer) obField.get(outputStream);
        Class<org.apache.catalina.connector.OutputBuffer> opb = org.apache.catalina.connector.OutputBuffer.class;
        Field outputChunkField = opb.getDeclaredField("outputChunk");
        outputChunkField.setAccessible(true);
        if (outputChunkField.getType().toString().endsWith("ByteChunk")) {
            ByteChunk bc = (ByteChunk) outputChunkField.get(outputBuffer);
            Integer length = bc.getLength();
            if (length == 0) return null;
            responseContent = new String(bc.getBytes(), "UTF-8");
            Integer responseLength = StringUtils.isBlank(responseContent) ? 0 : responseContent.length();
            if (responseLength < length) {
                responseContent = responseContent.substring(0, responseLength);
            } else {
                responseContent = responseContent.substring(0, length);
            }

        }
    }
    return responseContent;
}

当响应json较短时,代码运行良好。但当返回的json太长时,responseContent只包含部分响应内容,在登录之前解析内容失败(需要解析json并获得一些写入数据库的值)。

如何调整响应并获得完整的响应内容?

共有1个答案

毕衡
2023-03-14

增加tomcat defult缓冲区大小:

//default buffer size is:8*1024,in OutputBuffer class
//public static final int DEFAULT_BUFFER_SIZE = 8*1024;         
response.setBufferSize(2048 * 20);

这不是一个完美的解决方案,当响应大小超过2048*20时,它会计入异常。但可以处理大多数响应。

 类似资料:
  • 在过去的几天里做了一些阅读后,我已经取得了一些进展,下面是我想出的代码: 主要活动: HTTPRequest 没有错误,一切运行正常,但问题是-我已经建立了这个代码作为一个测试,如果我可以登录我试图登录的网站,但我无法从中获得任何信息。在我按下按钮后,似乎发生了什么事情,我发送到用户界面线程的输入流给了我这个:“java.io.BufferedInputStream@afe19b8”,每次按下按钮

  • 如何在androidretrofit2中获得完整的JSON响应。

  • 我想通过连接到另一个url再次解析从解析中获得的值。我怎么修理它? 从scrapy导入蜘蛛从scrapy.selector导入选择器 从堆栈.items导入堆栈项 类StackSpider(Spider):name=“stack”allowed_domains=[“*”]global n#n=1997 start_url=['https://www.melon.com/chart/age/list

  • 我的JSON: 上面的代码是什么我有treid,所以可以任何一个请帮助我获得整个响应不仅是父类别。

  • 问题内容: 我想知道如何使用XMLHttpRequest加载远程URL的内容,并将所访问站点的HTML存储在JS变量中。 说,如果我想加载并Alert()的HTML,我该怎么做? 问题答案: 您可以在等于时得到它。 这是一个示例(与IE6 / 7不兼容)。 为了获得更好的跨浏览器兼容性,不仅可以与IE6/7兼容,而且还可以解决某些浏览器特定的内存泄漏或错误,并且为了降低触发Ajaxical请求的冗