http访问第三方系统的接口时,小概率抛出下面的异常:

java.io.IOException: Premature EOF
at sun.net.www.http.ChunkedInputStream.readAheadBlocking(ChunkedInputStream.java:565)
at com.xxxxx.util.HttpUtil.getHttpsContent(HttpUtil.java:194)

相关代码如下:

	public static JSONObject getMsgRetry(String url, JSONObject json) throws IOException{
url = url + "?a=1";
for(Entry<String, Object> entry : json.entrySet()){
String key = entry.getKey();
Object value = entry.getValue();
url = url+"&"+key+"="+value;
}
HttpsURLConnection conn = HttpUtil.initHttpsConnectionKeepAlive(url, "GET");
String result = "";
try{
result = HttpUtil.getHttpsContent(conn, "utf-8");
}catch(Exception e){
logger.error("interface_error, let's retry.");
logger.error(e.toString());
try {
TimeUnit.SECONDS.sleep(2); // 延迟2秒,再重试
} catch (InterruptedException e1) {
logger.error(e1.toString());
}
result = HttpUtil.getHttpsContent(conn, "utf-8");
}finally{
conn.disconnect();
}
return JSONObject.parseObject(result);
}
	public static String getHttpsContent(HttpsURLConnection conn,
String characterCode) throws IOException {
InputStream inputStream = conn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(
inputStream, characterCode);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
StringBuffer buffer = new StringBuffer();
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
// 释放资源
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
conn.disconnect(); return buffer.toString();
}

上面的代码中:

while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}

  

while语句有时会抛出异常:

java.io.IOException: Premature EOF

at sun.net.www.http.ChunkedInputStream.readAheadBlocking(ChunkedInputStream.java:565)

搜索发现,这个是普遍性的一个问题,解决方法:

https://stackoverflow.com/questions/13210108/reading-a-web-page-in-java-ioexception-premature-eof

代码如下修改:

	public static String getHttpsContent(HttpsURLConnection conn, String characterCode) throws IOException {
InputStream inputStream = conn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(
inputStream, characterCode);
BufferedReader bufferedReader = new BufferedReader(
inputStreamReader);
// fix bug: java.io.IOException: Premature EOF
// at sun.net.www.http.ChunkedInputStream.readAheadBlocking(ChunkedInputStream.java:565)
// https://stackoverflow.com/questions/13210108/reading-a-web-page-in-java-ioexception-premature-eof
StringBuffer sb = new StringBuffer();
int BUFFER_SIZE = 1024;
char[] buffer = new char[BUFFER_SIZE]; // or some other size,
int charsRead = 0;
while ( (charsRead = bufferedReader.read(buffer, 0, BUFFER_SIZE)) != -1) {
sb.append(buffer, 0, charsRead);
} return sb.toString();
}

搞定。原因是第三方接口可能没有发送http协议需要的结束行。

The issue for you it may be that the server is not pushing that last end line character

最新文章

  1. Apache Shiro 学习记录2
  2. 【转】Oracle执行计划解释
  3. Third Day(上班第四天):Android开发环境配置问题相关
  4. 解剖SQLSERVER 第十一篇 对SQLSERVER的多个版本进行自动化测试(译)
  5. Android studio 使用SVN需要忽略的文件
  6. [转]Oracle中使用Rownum分页详细例子
  7. mysql 注释
  8. PHP-----二维数组和二分查找
  9. css 面试学习
  10. Myeclipse 保存jsp异常Save FailedCompilation unit name must end with .java, or one of the registered Java-like extensions
  11. 折腾iPhone的生活——越狱
  12. Android Fragment 嵌套使用报错
  13. Php函数完整参考手册
  14. 在Vim按了ctrl+s后
  15. ASP.Net Core开发(踩坑)指南
  16. QEMU, a Fast and Portable Dynamic Translator-Fabrice Bellard-翻译
  17. [转]Web应用防火墙WAF详解
  18. loj 6436 PKUSC2018 神仙的游戏
  19. git push fatal: The remote end hung up unexpectedly
  20. 微软2014校招笔试题-String reorder

热门文章

  1. [RN] React Native 实现图片预览
  2. 【转】Redis为什么用跳表而不用平衡树?
  3. 石锤了!google彻底断供华为,只能加速鸿蒙生态的形成
  4. Golang(三)Goroutine原理
  5. .net core 中的多环境配置
  6. python 判断矩阵中每行非零个数的方法
  7. Alpha冲刺——总结篇
  8. centos8 安装 docker
  9. C基本语法
  10. bypass-media 模式30秒挂断