1

我正在向服务器发送一个 HTTP 请求,该请求合法地返回一个 HTTP 响应代码 = 200(OK)的空白响应。

但这会导致下面的标记行抛出一个EOFException

InputStream responseStream = httpURLConnection.getInputStream();
final String contentEncoding = this.connection.getContentEncoding();
if ("gzip".equalsIgnoreCase(contentEncoding)) {
    responseStream = new GZIPInputStream(responseStream); // throws EOFException
}

可能有一种明显的方法可以防止这种情况,但我找不到。我是否应该在创建 GZIPInputStream 之前connection.getContentLength() > 0或之前进行检查?responseStream.available() > 0这些似乎都不对,我在示例代码片段中没有遇到任何类似的东西......

4

4 回答 4

3

我是否应该检查类似 connection.getContentLength() > 0

是的。

或 responseStream.available() > 0

当然不。available() == 0 不是 EOF 的有效测试,Javadoc 明确说明了这一点。

于 2013-02-11T17:36:49.917 回答
1

我从您的问题中了解到,每次您200从服务器收到响应时,都会始终抛出此异常。

如果responseStream.available() > 0不是选项,则表示流实际上包含某些内容,但该流似乎不完整或以任何其他方式过早结束,因为available表明流中有可读字节。


更新

根据您的评论(并且InputStream出于纯粹的好奇心再次阅读 's 文档后),我也相信connection.getContentLength() > 0这是要走的路。如果您使用的是 Java 7,connection.getContentLengthLong()则较难使用,因为它long直接返回 a。

鉴于文档所说的InputStream#available

InputStream 类的可用方法总是返回 0。

请注意,虽然 InputStream 的某些实现会返回流中的字节总数,但许多不会。使用此方法的返回值来分配旨在保存此流中所有数据的缓冲区是不正确的。

这将放弃该检查作为选项。

于 2013-02-11T17:31:11.857 回答
1

您的服务器不应该返回 HTTP 代码 204(无内容)而不是 200 吗?除了 HEAD 请求之外。请参阅Http 状态码定义

除此之外,您确实可以检查以解决看起来不太兼容的服务器实现,或者捕获异常,然后根据您发送的请求类型确定正确的操作。

于 2013-02-11T17:28:09.360 回答
0

除非我遗漏了某些东西,否则根据定义,内容编码“gzip”的响应不能为空。

于 2016-11-09T16:25:37.883 回答