我正在尝试使用带有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对象。
我非常感谢你能否解决这个问题,因为我现在这是一个很高的生产问题!
答案 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)
}
在一些讨厌的情况下,如果你只是坐在HttpURLConnection后面,还有其他问题不容易被发现。然后,您可以使用适当的工具启用日志记录或窥探TCP / IP流量(取决于您的基础架构,权限,操作系统......)。 This SO post可能会对您有所帮助。
*)在您的情况下,我认为您从服务器获得了非错误状态代码,但是无法解析XML。如果记录流量不是你的事情,你可以读取InputStream,将其写入文件,然后像以前一样处理流。当然,您可以将流写入ByteArrayOutputStream,获取byte []并将该Bytes写入文件,然后将它们转换为ByteArrayInputStream并将其提供给XML解析器。或者您可以使用Commons IO TeeInputStream为您处理。
有些情况connection.getResponseCode()
会引发异常。然后无法解析HTTP标头。只有在服务器软件,硬件或防火墙,代理或负载均衡器表现不佳时才会出现奇怪的错误。
还有一件事:您可以考虑选择HTTP客户端库,而不是直接使用HttpURLConnection
。