多个HttpURLConnection调用使用InputStream抛出文件异常提前结束

时间:2014-01-27 22:21:14

标签: java inputstream httpurlconnection

我正在尝试使用带有GET方法的HttpURLConnection对REST API进行多次调用,并通过InputStream检索响应。

之前的工作状态好3个月,但现在却低于例外:

  
    

在getArtifactsUrl方法:: org.xml.sax.SAXParseException期间发生SAXException;文件过早结束。             at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)[xercesImpl.jar:6.1.0.Final]             at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)[xercesImpl.jar:6.1.0.Final]             在javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:121)[:1.7.0_03]

  

下面是我正在进行第二次调用以解析响应的代码行:

request = (HttpURLConnection) endpointUrl.openConnection();             
inputstream = request.getInputStream();             
doc = dBuilder.parse(inputstream);

第一次调用使用请求和输入流对象正常工作,但第二次调用失败。我尝试了在谷歌找到的所有可能的答案,但没有运气: 每次通话后:

inputstream.close();
request.disconnect();

请记住,请求是一个HttpURLConnection对象。

我非常感谢你能否解决这个问题,因为我现在这是一个很高的生产问题!

1 个答案:

答案 0 :(得分:0)

首先,您应该检查错误情况,而不是假设它始终有效。

试试这个:

request = (HttpURLConnection) endpointUrl.openConnection();             

request.connect(); // not really necessary (done automatically)
int statusCode = request.getResponseCode();
if (statusCode == 200) { // or maybe other 2xx codes?

    // Success - should work if server gives good response
    inputstream = request.getInputStream();

    // if you get status code 200 and still have the same error, you should
    // consider logging the stream to see what document you get from server.
    // (see below *)

    doc = dBuilder.parse(inputstream);

} else {

    // Something happened

    // handle error, try again if it makes sense, ...
    if (statusCode == 404) ... // resource not found 
    if (statusCode == 500) ... // internal server error

    // maybe there is something interesting in the body

    inputstream = request.getErrorStream();
    // read and parse errorStream (but probably this is not the body
    // you expected)

}

查看List of HTTP status codes

在一些讨厌的情况下,如果你只是坐在HttpURLConnection后面,还有其他问题不容易被发现。然后,您可以使用适当的工具启用日志记录或窥探TCP / IP流量(取决于您的基础架构,权限,操作系统......)。 This SO post可能会对您有所帮助。

*)在您的情况下,我认为您从服务器获得了非错误状态代码,但是无法解析XML。如果记录流量不是你的事情,你可以读取InputStream,将其写入文件,然后像以前一样处理流。当然,您可以将流写入ByteArrayOutputStream,获取byte []并将该Bytes写入文件,然后将它们转换为ByteArrayInputStream并将其提供给XML解析器。或者您可以使用Commons IO TeeInputStream为您处理。

有些情况connection.getResponseCode()会引发异常。然后无法解析HTTP标头。只有在服务器软件,硬件或防火墙,代理或负载均衡器表现不佳时才会出现奇怪的错误。

还有一件事:您可以考虑选择HTTP客户端库,而不是直接使用HttpURLConnection