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

  • 相关阅读:
    Pentest_Mind-mapping 渗透测试思维导图
    pt-archiver归档数据丢失
    Vue笔记:bin-code-editor使用
    Vue笔记:Vue3 Table导出为Excel
    Go异步check简单示例
    flask_apscheduler定时任务组件使用
    组织沟通文化的变革与卓有成效的管理沟通
    业绩核能
    管理
    SAP MM 移动平均价管理的物料库存初始化导入的一个小问题
  • 原文地址:https://www.cnblogs.com/kumu/p/10241986.html
Copyright © 2020-2023  润新知