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

  • 相关阅读:
    面向接口程序设计思想实践
    Block Chain Learning Notes
    ECMAScript 6.0
    Etcd Learning Notes
    Travis CI Build Continuous Integration
    Markdown Learning Notes
    SPRING MICROSERVICES IN ACTION
    Java Interview Questions Summary
    Node.js Learning Notes
    Apache Thrift Learning Notes
  • 原文地址:https://www.cnblogs.com/kumu/p/10241986.html
Copyright © 2011-2022 走看看