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)

相关代码如下:

	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

posted on 2019-08-01 12:18  digdeep  阅读(11858)  评论(0编辑  收藏  举报
不懂数据库和Web安全的架构师不是一个好的程序员。