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时报异常的更多相关文章

  1. HttpClient(4.3.5) - HTTP Entity

    HTTP entity HTTP messages can carry a content entity associated with the request or response. Entiti ...

  2. [VS2015].NET4.0环境下使用.NET2.0程序集,使用sqlite时报异常 出现“混合模式程序集异常”

    在.net 4.0环境下使用sqlite时报异常 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集其调用的方法是从sqli ...

  3. resultset 对象获取行字段数据时报:java.sql.SQLException: Column 'id' not found.

    resultset 对象获取行字段数据时报:java.sql.SQLException: Column 'id' not found. 代码: String sql="SELECT d.co ...

  4. PHP模拟POST请求,获取response内容

    /* * 模拟POST请求,获取response内容 */ protected function curl($url, $type, $header, $data) { $CURL_OPTS = ar ...

  5. hibernate3 Duplicate class/entity mapping(异常)

    hibernate3 Duplicate class/entity mapping(异常) 代码:      Configuration config = new Configuration().ad ...

  6. .Net MVC 获取Response和Request对象

    通过  System.Web.HttpContext.Current  获取 public static string ConstractExportExcel(List<ERP_Contrac ...

  7. 在Application_Error获取Asp.Net未处理异常信息

    在Application_Error获取Asp.Net未处理异常信息 protected void Application_Error(object sender, EventArgs e) { // ...

  8. spring cloud gateway获取response body

    网关发起请求后,微服务返回的response的值要经过网关才发给客户端.本文主要讲解在spring cloud gateway 的过滤器中获取微服务的返回值,因为很多情况我们需要对这个返回进行处理.网 ...

  9. rabbitmq使用延迟时报异常

    声明交换机为延迟时报异常( unknown exchange type 'x-delayed-message')的解决方法 服务端需下载安装插件: 1.下载插件包 2.将下载后的插件包移至服务安装目录 ...

随机推荐

  1. calayer 的特殊属性整理

    calayer: An object that manages image-based content and allows you to perform animations on that con ...

  2. 2、Android-UI(常用控件)

    2.1.如何编写程序页面 Android中有许多编写程序的方式可供选择 Android Studio和Eclipse中都提供了响应的可视化编辑器 可以直接再进行拖动创建布局 推荐使用手动编写方式进行开 ...

  3. jquery mobile各类标签的refresh

    JQM里面当我们更新了某些页面标签(如: listview, radiobuttons, checkboxes, select menus)里的数据时,必须做refresh操作. 为什么必须做refr ...

  4. (转)进程process和线程thread的关系

    写的很好很明白cpu每次只能执行一个进程,所以其他进程会挂起 在一个进程中,允许存在n个线程,n个线程共享这个进程中的资源 多个线程在共享的时候存在资源互斥,一次只能一个线程,会需要加锁 一次存在固定 ...

  5. HDU 2087 剪花布条 (简单KMP或者暴力)

    剪花布条 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  6. vlc源码分析(六) 调用OpenMAX硬解码H.265

    H.265(HEVC)编码格式能够在得到相同编码质量视频的前提下,使用相当于H.264(AVC)一半的存储容量,虽然H.265的算法复杂度比H.264高一个数量级,但是硬件水平在不断提高,因此H.26 ...

  7. jquery checkbox点选反选

    <script type="text/javascript"> $(function(){ //点选反选 $("#check_all").click ...

  8. 关于2018年第九届蓝桥杯[C++省赛B组][第四题:测试次数]的疑问

    题目来源:https://blog.csdn.net/qq_34202873/article/details/79784548 #标题:测试次数#x星球的居民脾气不太好,但好在他们生气的时候唯一的异常 ...

  9. td内的所有数字格式化保留两位小数

    $("td").each(function(i,el){ var td = parseFloat($(el).text()); if(!isNaN(td)){ $(el).text ...

  10. 高性能MySQL--MySQL数据类型介绍和最优数据类型选择

    MySQL支持的数据类型很多,那么选择合适的数据类型对于获得高性能就至关重要.那么就先了解各种类型的优缺点! 一.类型介绍 1.整型类型 整型类型有: TINYINT,SMALLINT,MEDIUMI ...