Java get的多个HttpURLConnection调用引发InputStream文件结束异常

Java get的多个HttpURLConnection调用引发InputStream文件结束异常,java,inputstream,httpurlconnection,Java,Inputstream,Httpurlconnection,我试图使用带有GET方法的HttpURLConnection对RESTAPI进行多次调用,并通过InputStream检索响应 它以前在3个月内运行良好,但现在出现以下异常: getArtifactsUrl方法::org.xml.sax.saxpasseeption期间发生SAXException;文件过早结束。 位于org.apache.xerces.parsers.DOMParser.parse(未知源)[xercesImpl.jar:6.1.0.Final] 位于org.apache.xe

我试图使用带有GET方法的
HttpURLConnection
对RESTAPI进行多次调用,并通过InputStream检索响应

它以前在3个月内运行良好,但现在出现以下异常:

getArtifactsUrl方法::org.xml.sax.saxpasseeption期间发生SAXException;文件过早结束。 位于org.apache.xerces.parsers.DOMParser.parse(未知源)[xercesImpl.jar:6.1.0.Final] 位于org.apache.xerces.jaxp.DocumentBuilderImpl.parse(未知源)[xercesImpl.jar:6.1.0.Final] 在javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:121)[:1.7.003]

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

request = (HttpURLConnection) endpointUrl.openConnection();             
inputstream = request.getInputStream();             
doc = dBuilder.parse(inputstream);
第一个调用使用request和inputstream对象工作正常,但第二个调用失败。我尝试了在谷歌上找到的所有可能的答案,但没有成功: 每次通话后:

inputstream.close();
request.disconnect();
请记住,请求是一个HttpURLConnection对象


我非常感谢如果你能解决这个问题,因为我认为这是一个高优先级的生产问题了

首先,您应该检查错误案例,而不是假设它总是有效的

试试这个:

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)

}
看一看这张照片

在一些糟糕的情况下,如果您只是坐在HttpURLConnection后面,那么还有其他问题不容易发现。然后,您可以使用适当的工具(取决于您的基础设施、权限、操作系统等)启用TCP/IP流量的日志记录或窥探。也许对你有帮助

*)在您的例子中,我假设您从服务器获得了一个非错误状态代码,但是是不可解析的XML。如果不需要记录流量,可以读取InputStream,将其写入文件,然后像前面一样处理该流。当然,您可以将流写入ByteArrayInputStream,获取字节[],并将该字节写入文件,然后将其转换为ByteArrayInputStream,并将其提供给XML解析器。或者你可以用它来帮你处理

在某些情况下,
connection.getResponseCode()
会引发异常。然后就不可能解析HTTP头了。只有当服务器软件、硬件或防火墙、代理或负载平衡器出现异常错误时,才会发生这种情况


另外一件事:您可能会考虑选择HTTP客户端库,而不直接使用<代码> HTTURLLCONTION/COMP> >

抱歉此迟响应。我发现问题出在我们第二次服务呼叫的响应代码302上。因此,需要与其他合作伙伴进行检查,并在我们的代码中进行相应的处理。但是,感谢您对这一问题的回答,我建议您在尝试使用HttpURLConnection调用RESTful服务时使用上述方法。您可以调用
HttpURLConnection.setInstanceFollowRedirects(true)
,这样您就不必手动处理它了。但这仅在没有协议切换(http->https或vv)和使用GET请求时有效。(顺便说一句,在Android上它取决于版本。)这是正确的,但在我们的例子中,它是协议(http->https)的切换,所以需要在我们的代码中相应地处理它。