digdeep

凡是过去,皆是序幕。Read the fucking manual and source code.

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 

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)

相关代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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);
}

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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();
}

 

上面的代码中:

1
2
3
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

代码如下修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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

posted on   digdeep  阅读(12289)  评论(0编辑  收藏  举报
努力加载评论中...
不懂数据库和Web安全的架构师不是一个好的程序员。
点击右上角即可分享
微信分享提示