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()的时候才是去读取数据的时候,过早的关闭均会导致获取不到数据

原文地址:https://www.cnblogs.com/kumu/p/10241986.html

时间: 2024-10-09 11:36:11

httpclient在获取response的entity时报异常的相关文章

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

在.net 4.0环境下使用sqlite时报异常 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集其调用的方法是从sqlite数据库中获取原来已经使用过的数据库连接,当时也没注意,就是准备设断点然后单步调试,结果竟然是断点无法进入方法体内,后来仔细看了一下方法体的时候发现了一个问题,就是现有的System.Data.Sqlite这个数据访问provider是针对.NET2.0环境开发(最新的版本是1.0.66.0,20

hibernate3 Duplicate class/entity mapping(异常)

hibernate3 Duplicate class/entity mapping(异常) 代码:      Configuration config = new Configuration().addClass(User.class).buildSessionFactory(); 解决方法:去掉红色的代码.原因: sessionFactory = config.configure().buildSessionFactory(),已经读取了一次配置, (它会与hibernate.cfg.xml里

android通过httpClient请求获取JSON数据并且解析

android通过httpClient请求获取JSON数据并且解析:http://www.cnblogs.com/gzggyy/archive/2013/05/08/3066288.html Android--使用Http向服务器发送请求并取得返回结果,下载图片:http://www.2cto.com/kf/201307/229489.html Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据):http://blog.csdn.net/he

Entity FrameWork异常:无法加载指定的元数据资源

今天在EF开发的过程中报出这样的错误:Entity FrameWork异常:无法加载指定的元数据资源 在网上看了一些帖子,一般说的解决方法都比较繁琐. 我是这么解决的: 首先我先说下我的文件结构层次:存在web类库和Dal类库,而数据的edmx是在DAL类库中. 我猜想可能是两个配置文件不同造成的,就把dal中的appconfig中的连接键复制到web的webconfig中,并删除掉原来的,果然就不报错了,但又出现了另一个错误:基础提供程序在 Open 上失败 然后,我把web中的webconf

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

resultset 对象获取行字段数据时报:java.sql.SQLException: Column 'id' not found. 代码: String sql="SELECT d.content,c.name AS categoryName FROM news_detail d,news_category c WHERE d.categoryId=c.id"; Object[] params ={}; System.out.println(this.executeQuery(sq

spring cloud gateway获取response body

网关发起请求后,微服务返回的response的值要经过网关才发给客户端.本文主要讲解在spring cloud gateway 的过滤器中获取微服务的返回值,因为很多情况我们需要对这个返回进行处理.网上有很多例子,但是都没有解决我的实际问题,最后研究了下源码找到了解决方案. 本节内容主要从如下几个方面讲解,首先需要了解我的博文的内容:API网关spring cloud gateway和负载均衡框架ribbon实战 和 spring cloud gateway自定义过滤器 本文也将根据上面两个项目

HttpClient(4.3.5) - HTTP Entity

根据实体的起源,HttpClient 将实体分为三类: streamed - 实体内容是从流接收或者再运行中产生的.特别地,这类实体包括从 HTTP 响应接收的.streamed 实体通常是不可重复读取的. self-contained - 实体内容是存在于内存或者是通过独立的连接或其他实体获得的.self-contained 实体是可重复读取的.这类实体经常用于实体封装的 HTTP 请求. wrapping - 实体内容是从其他实体获得的.当从 HTTP 响应中获取流式内容时,这个区别对于连接

Mono.Cecil 修改目标.NET的IL代码保存时报异常的处理。

使用Mono.Cecil对目标.NET的DLL程序进行IL修改后保存时报"Failed to resolve assembly: ' xxxxxx, version=xxxxx,Culture=xxxxx,PublicKeyToken=xxxxxxx'"异常. 使用DNSPY进行调试,原来是因为修改的目标DLL和本身程序不在同一个目录,当需要用到目标DLL引用的DLL时Mono.Cecil只在自身所在的目录进行搜索匹配, 找不到对应的DLL文件就会报上面的异常信息. 解决方法有两种:

使用Spring MVC 的 @RequestBody 映射json请求参数时报异常问题

使用Spring MVC 的 @RequestBody 映射json请求参数时报"The request sent by the client was syntactically incorrect."异常解决方案 最近工作中开发RESTful接口需要处理客户端上传的json,图方便想起Spring的Controller中有@RequestBody可以优雅地完成json报文与Java类的映射,但是使用时碰到了 "The request sent by the client w