httpclient在获取response的entity时报异常
httpClient报异常:Premature end of chunk coded message body: closing chunk expected

首先这个异常提示直译过来就是:被编码信息体数据块的过早结尾,数据块关闭异常
昨天第一眼看到这个异常时,我是丈二和尚摸不着头脑,一通搜索也没搞清楚。当时时间较晚就先睡觉了,然后今天再测试时还是这个异常,这个时候我就仔细看了下这个异常提示,关键词是“Premature(过早)”和“end(结束)”,那么按照这个提示思路我就发现我出错的原因是过早关闭了HttpResponse这个对象了。所以这个bug的教训就是要仔细阅读理解异常的提示内容。好了,接下来是按照我自己的实际代码来分析。
最开始我是这么处理的,首先是执行GET请求,获取到response之后二次封装成自定义的HttpResponseEntity(提取状态码和Entity),然后return后续再处理。
看下面一张图的代码可知,我在finally里面进行了response.close()释放资源。

然后在下图里的后续处理中使用EntityUtils.toString()来获取Entity中的数据。
从实际的异常堆栈提示可知,实际抛异常的地方就是红框所框选的位置,也就是EntityUtils.toString()。

至于为什么使用EntityUtils.toString()会导致异常呢?难道数据不是已经被请求到,并保存在Entity之中的了嘛?
答案是:数据还没真正被获取到,具体可以看EntityUtils.toString()的源码,如下图。
在toString()的开头便获取了InputStream输入流,然后读取数据后在最后面instream.close()关闭输入流(图太长,只截取头尾两部分),个人觉得这里的输入流是与socket相关的流。
也就是说toString()的时候才是去读取数据的时候,过早的关闭均会导致获取不到数据


httpclient在获取response的entity时报异常的更多相关文章
- HttpClient(4.3.5) - HTTP Entity
HTTP entity HTTP messages can carry a content entity associated with the request or response. Entiti ...
- [VS2015].NET4.0环境下使用.NET2.0程序集,使用sqlite时报异常 出现“混合模式程序集异常”
在.net 4.0环境下使用sqlite时报异常 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集其调用的方法是从sqli ...
- resultset 对象获取行字段数据时报:java.sql.SQLException: Column 'id' not found.
resultset 对象获取行字段数据时报:java.sql.SQLException: Column 'id' not found. 代码: String sql="SELECT d.co ...
- PHP模拟POST请求,获取response内容
/* * 模拟POST请求,获取response内容 */ protected function curl($url, $type, $header, $data) { $CURL_OPTS = ar ...
- hibernate3 Duplicate class/entity mapping(异常)
hibernate3 Duplicate class/entity mapping(异常) 代码: Configuration config = new Configuration().ad ...
- .Net MVC 获取Response和Request对象
通过 System.Web.HttpContext.Current 获取 public static string ConstractExportExcel(List<ERP_Contrac ...
- 在Application_Error获取Asp.Net未处理异常信息
在Application_Error获取Asp.Net未处理异常信息 protected void Application_Error(object sender, EventArgs e) { // ...
- spring cloud gateway获取response body
网关发起请求后,微服务返回的response的值要经过网关才发给客户端.本文主要讲解在spring cloud gateway 的过滤器中获取微服务的返回值,因为很多情况我们需要对这个返回进行处理.网 ...
- rabbitmq使用延迟时报异常
声明交换机为延迟时报异常( unknown exchange type 'x-delayed-message')的解决方法 服务端需下载安装插件: 1.下载插件包 2.将下载后的插件包移至服务安装目录 ...
随机推荐
- EF直接的一對多多對多多對一的關係----也即是鏈錶查詢
基于EF4.1 code first 简单的CRUD 园子中已经有很多了 ~~ 真不想再写这个了 可是为了做一个完整的小demo 从开始 到后面的一些简单重构 还是决定认真把这个写出来 争取写些别人 ...
- ethereumjs/ethereumjs-block-3-tests
之前可以先了解一下另一个模块,看本博客的ethereumjs/ethereumjs-common部分内容 通过tests测试文件能够帮助更好了解API的使用 ethereumjs-block/test ...
- IE6/IE7不支持first-child的解决办法
#sidebar li:first-child{ border-top-style:none; } #sidebar li{ border-top-width:1px; border-top-styl ...
- Yum 下载安装包及对应依赖包
Yum 下载安装包及对应依赖包: 安装该软件:yum install -y yum-plugin-downloadonly 以下载 openssh-server 为例 yum install -y o ...
- HDU 1058(打表)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1058 Humble Numbers Time Limit: 2000/1000 MS (Java/O ...
- 进程通信-Queue
进程通信-Queue Queue消息队列是python进程通信的其中一种方式.需要引入multiprocessing包中的Queue函数(这是函数,不是类). 有一个queue包,里面也有Queue, ...
- Python中级 —— 01面向对象进阶
面向对象进阶 总结.补充(http://blog.csdn.net/fgf00/article/details/52479307) 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 ...
- 笔记:javascript操作iframe内的DOM元素,及调用iframe内的方法
iframe相当于一个嵌入在网页内的浏览器,它与当前网页是隔离的. 但有时我们也需要在当前网页操作iframe内的元素或操作iframe内的javascript方法. 在网页内操作DOM元素,是使用d ...
- django 登录注册注销
一.设计数据模型 1.数据库模型设计 作为一个用户登录和注册项目,需要保存的都是各种用户的相关信息.很显然,我们至少需要一张用户表User,在用户表里需要保存下面的信息: 用户名 密码 邮箱地址 性别 ...
- STM32 HAL库学习系列第5篇 定时器TIM---编码器接口模式配置
cube基本配置,外设开启编码器,串口2 可能大家在设置的时候有这个错误 错误:error: #20: identifier "TIM_ICPOLARITY_BOTHEDGE" ...