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