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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步