【发布时间】:2023-04-06 20:22:01
【问题描述】:
HttpURLConnection.getInputStream() 给出 UnknownLengthHttpInputStream 并且由于此 Document 解析引发 SAX 解析器异常。
以下是代码
try{
URL url = new URL(uri);
HttpURLConnection connection =
(HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setRequestProperty("Accept", "application/xml");
InputStream xml = connection.getInputStream();
System.out.println(connection.getResponseCode());
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(connection.getInputStream());
doc.getDocumentElement().normalize();
}catch(Exception e){
e.printStackTrace();
}
任何人都知道 UnknownLengthHttpInputStream 的原因。我只在 android 中收到此错误,并且此代码在 Java Project 中完美运行。
以下是 LogCat 的异常:
08-08 11:07:40.490: W/System.err(1493): org.xml.sax.SAXParseException: Unexpected end of document
08-08 11:07:40.504: W/System.err(1493): at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:129)
08-08 11:07:40.510: W/System.err(1493): at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:107)
08-08 11:07:40.510: W/System.err(1493): at com.example.testws.MainActivity.onCreate(MainActivity.java:59)
08-08 11:07:40.520: W/System.err(1493): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-08 11:07:40.520: W/System.err(1493): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
08-08 11:07:40.520: W/System.err(1493): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
08-08 11:07:40.520: W/System.err(1493): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
08-08 11:07:40.530: W/System.err(1493): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
提前致谢。
【问题讨论】:
-
附加来自 logcat 的异常?
-
@Jens 我附上了来自 logcat 的异常..
-
您获得了
UnknownLengthHttpInputStream流,因为您的服务器没有提供Content-Length或使用分块传输编码。当服务器不提供任何一个时,它必须通过关闭连接来发出 HTTP 正文的结束信号——在这种情况下,它似乎在中间文档中执行。执行此调用时是否有可能嗅探 Web 服务器流量(例如使用 WireShark)? -
尝试在赋值后立即打印“xml”变量。它是在控制台上打印响应还是生成错误?
-
对于 SOAP 调用尝试使用 KSoap2 而不是 HTTP 调用
标签: java android web-services inputstream saxparser