当前位置: 首页 > news >正文

HTTP客户端警告:Going to buffer response body of large or unknown size

HTTP客户端警告:Going to buffer response body of large or unknown size

   点关注不迷路,欢迎再访!	

精简博客内容,尽量已行业术语来分享。
努力做到对每一位认可自己的读者负责。
帮助别人的同时更是丰富自己的良机。

目录

    • HTTP客户端警告:Going to buffer response body of large or unknown size
        • 原编码问题
          • 源码分析 getResponseBodyAsString()源码
        • getResponseBodyAsStream()源码
          • 优化原编码

原编码问题

在这里插入图片描述

HttpClient发现抛出Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is recommended,查看原有代码中的逻辑如下:

HttpClient httpclient = new HttpClient();
GetMethod getMethod = new GetMethod(url);
int statusCode = httpclient.executeMethod(getMethod);
String respContent = getMethod.getResponseBodyAsString();
源码分析 getResponseBodyAsString()源码
	//getResponseBodyAsString()方法源码public String getResponseBodyAsString() throws IOException {byte[] rawdata = null;if (this.responseAvailable()) {//调用了getResponseBody(),容易消耗内存rawdata = this.getResponseBody();}return rawdata != null ? EncodingUtil.getString(rawdata, this.getResponseCharSet()) : null;}//responseAvailable()方法源码private boolean responseAvailable() {return this.responseBody != null || this.responseStream != null;}//getResponseBody()方法源码public byte[] getResponseBody() throws IOException {if (this.responseBody == null) {InputStream instream = this.getResponseBodyAsStream();if (instream != null) {long contentLength = this.getResponseContentLength();if (contentLength > 2147483647L) {throw new IOException("Content too large to be buffered: " + contentLength + " bytes");}int limit = this.getParams().getIntParameter("http.method.response.buffer.warnlimit", 1048576);if (contentLength == -1L || contentLength > (long)limit) {//这里是warn的原文LOG.warn("Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is recommended.");}LOG.debug("Buffering response body");ByteArrayOutputStream outstream = new ByteArrayOutputStream(contentLength > 0L ? (int)contentLength : 4096);byte[] buffer = new byte[4096];int len;while((len = instream.read(buffer)) > 0) {outstream.write(buffer, 0, len);}outstream.close();this.setResponseStream((InputStream)null);this.responseBody = outstream.toByteArray();}}return this.responseBody;}

从源码中可以看出,warn的条件是(contentLength == -1L || contentLength > (long)limit),如果http头没有指定contentLength或大于上限值(默认1M),就会抛异常。其实,如果返回的结果比较确定,对程序没有太大影响。而对于返回结果不确定时,源码也建议我们使用下面的getResponseBodyAsStream()方法。

getResponseBodyAsStream()源码
public InputStream getResponseBodyAsStream() throws IOException {if (this.responseStream != null) {return this.responseStream;} else if (this.responseBody != null) {InputStream byteResponseStream = new ByteArrayInputStream(this.responseBody);LOG.debug("re-creating response stream from byte array");return byteResponseStream;} else {return null;}}

从源码中可以看出,getResponseBodyAsStream()内部没有使用getResponseBody()方法,避免了内存耗尽问题,而是使用了InputStream流方式处理。

优化原编码
HttpClient httpclient = new HttpClient();
GetMethod getMethod = new GetMethod(url);
int statusCode = httpclient.executeMethod(getMethod);
//String respContent = getMethod.getResponseBodyAsString();
//使用getResponseBodyAsStream()
InputStream inputStream = getMethod.getResponseBodyAsStream();
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
StringBuffer stringBuffer = new StringBuffer();
String str = "";
while ((str = br.readLine()) != null) {stringBuffer.append(str);
}
LOGGER.info("respContent: {}", stringBuffer.toString());

相关文章:

  • qml渲染引擎介绍
  • ChatGPT/GPT4科研实践应用与AI绘图技术及论文高效写作
  • golang指针学习
  • 完全平方数(模版)
  • Codeforces Round 745 (Div. 2)(C:前缀和+滑动窗口,E:位运算加分块)
  • 智能座舱架构与芯片- (13) 软件篇 下
  • 函数与数组
  • 音视频同步笔记 - 以音频时间为基
  • redis运维(十九)redis 的扩展应用 lua(一)
  • 如何下载OpenJDK及其源码
  • PHP 语法||PHP 变量
  • 睡前随笔记录
  • 含分布式电源的配电网可靠性评估matlab程序
  • Apache配置虚拟主机
  • 【双指针】有效三角形的个数
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • ECS应用管理最佳实践
  • ES6简单总结(搭配简单的讲解和小案例)
  • Hexo+码云+git快速搭建免费的静态Blog
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • JSDuck 与 AngularJS 融合技巧
  • JSONP原理
  • Just for fun——迅速写完快速排序
  • Redis学习笔记 - pipline(流水线、管道)
  • Redux 中间件分析
  • Spring Cloud Feign的两种使用姿势
  • vue2.0项目引入element-ui
  • Web Storage相关
  • windows-nginx-https-本地配置
  • 闭包--闭包作用之保存(一)
  • 聊一聊前端的监控
  • 使用 @font-face
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 使用parted解决大于2T的磁盘分区
  • 用Canvas画一棵二叉树
  • 怎么将电脑中的声音录制成WAV格式
  • 正则表达式
  • Java数据解析之JSON
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 积累各种好的链接
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​马来语翻译中文去哪比较好?
  • ​你们这样子,耽误我的工作进度怎么办?
  • ​虚拟化系列介绍(十)
  • (2020)Java后端开发----(面试题和笔试题)
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (二)springcloud实战之config配置中心
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (十六)Flask之蓝图
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)Oracle 9i 数据库设计指引全集(1)
  • .NET 4.0中的泛型协变和反变
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .Net程序帮助文档制作