http访问第三方系统的接口 java.io.IOException: Premature EOF

http访问第三方系统的接口时,小概率抛出下面的异常:
java.io.IOException: Premature EOF
异常如下:

xxxBiz 推送数据异常
 java.io.IOException: Premature EOF
	at sun.net.www.http.ChunkedInputStream.readAheadBlocking(ChunkedInputStream.java:565) ~[?:1.8.0_144]
	at sun.net.www.http.ChunkedInputStream.readAhead(ChunkedInputStream.java:609) ~[?:1.8.0_144]
	at sun.net.www.http.ChunkedInputStream.read(ChunkedInputStream.java:696) ~[?:1.8.0_144]
	at java.io.FilterInputStream.read(FilterInputStream.java:133) ~[?:1.8.0_144]
	at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3375) ~[?:1.8.0_144]
	at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) ~[?:1.8.0_144]
	at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) ~[?:1.8.0_144]
	at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) ~[?:1.8.0_144]
	at java.io.InputStreamReader.read(InputStreamReader.java:184) ~[?:1.8.0_144]
	at java.io.BufferedReader.fill(BufferedReader.java:161) ~[?:1.8.0_144]
	at java.io.BufferedReader.readLine(BufferedReader.java:324) ~[?:1.8.0_144]
	at java.io.BufferedReader.readLine(BufferedReader.java:389) ~[?:1.8.0_144]
	at com.winchance.hcl.common.util.HttpUtils.inputStream2String(HttpUtils.java:327) ~[classes/:?]

相关代码如下:

	public static String post(String address, Map<String, String> headerParameters, String body) throws Exception {
		if (body != null) {
			return proxyHttpRequest(address, "POST", headerParameters, body);
		}
		return proxyHttpRequest(address, "POST", null, getRequestBody(headerParameters));
	}
	public static String proxyHttpRequest(String address, String method, Map<String, String> headerParameters,
			String body) throws Exception {
		String result = null;
		HttpURLConnection httpConnection = null;

		try {
			httpConnection = createConnection(address, method, headerParameters, body);
			String encoding = "UTF-8";
			if (httpConnection.getContentType() != null && httpConnection.getContentType().indexOf("charset=") >= 0) {
				encoding = httpConnection.getContentType()
						.substring(httpConnection.getContentType().indexOf("charset=") + 8);
			}
			result = inputStream2String(httpConnection.getInputStream(), encoding);
		} finally {
			if (httpConnection != null) {
				httpConnection.disconnect();
			}
		}
		return result;
	}

	
	/**
	 * 读取inputStream 到 string
	 * @param input
	 * @param encoding
	 * @return
	 * @throws IOException
	 */
	private static String inputStream2String(InputStream input, String encoding)
			throws IOException {
		BufferedReader reader = new BufferedReader(new InputStreamReader(input,
				encoding));
		StringBuilder result = new StringBuilder();
		String temp = null;
		while ((temp = reader.readLine()) != null) {
			result.append(temp);
		}
		return result.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
代码如下修改:

	/**
	 * 读取inputStream 到 string
	 * 
	 * @param input
	 * @param encoding
	 * @return
	 * @throws IOException
	 */
	private static String inputStream2String(InputStream input, String encoding) throws IOException {
		BufferedReader reader = new BufferedReader(new InputStreamReader(input, encoding));
	    // 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
		StringBuilder result = new StringBuilder();
		int BUFFER_SIZE = 1024;
	    char[] buffer = new char[BUFFER_SIZE]; // or some other size,
	    int charsRead = 0;
	    while ( (charsRead  = reader.read(buffer, 0, BUFFER_SIZE)) != -1) {
	    	result.append(buffer, 0, charsRead);
	    }
		return result.toString();

	}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值