从android中的HttpURLConnection获取InputStream时获取UnknownLengthHttpInputStream

Ach*_*sah 16 java android web-services inputstream saxparser

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();
}
Run Code Online (Sandbox Code Playgroud)

任何人都知道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)
Run Code Online (Sandbox Code Playgroud)

提前致谢.

小智 -2

您需要在服务中正确关闭输出流以避免出现此异常。如果您使用第三方库,请确保您已设置响应标头

Content-Type
Content-Length
Run Code Online (Sandbox Code Playgroud)

如果您使用的是java服务,您可以从方法中获取内容长度

File.length()
Run Code Online (Sandbox Code Playgroud)

  • HTTP 协议规定,在特定情况下,您可以得到没有 Content-Length 标头的响应:http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.4 此外,您不能总是修改您所调用的服务,因为它并不总是您的。 (2认同)