网页源不是由HTTPClient完全读取的

时间:2017-04-01 17:20:13

标签: http inputstream httpurlconnection bufferedreader androidhttpclient

我可以使用以下代码下载较小的JSON响应:

    public String getHTTPData() {

        HttpURLConnection httpURLConnection = null;

        InputStream inputStream = null;

        try {

            httpURLConnection = (HttpURLConnection) (new URL(BASE_URL)).openConnection();
            httpURLConnection.setRequestMethod("GET");
            httpURLConnection.setDoInput(true);
            httpURLConnection.connect();

            StringBuffer stringBuffer = new StringBuffer();
            inputStream = httpURLConnection.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            String line = null;

            while ((line = bufferedReader.readLine()) != null) {

                stringBuffer.append(line + "\n");
            }

            inputStream.close();

            httpURLConnection.disconnect();

        } catch (Throwable t) {

            t.printStackTrace();

        } finally {

            try {

                inputStream.close();

                httpURLConnection.disconnect();

            } catch (Throwable t) {

                t.printStackTrace();
            }
        }

        return null;
    }

但是当我找不到某个API(中文字典API)时,我想我也可以解析我需要的数据的HTML源代码。但我似乎只得到源代码的前100行。我必须遗漏一些非常简单的东西,比如'maxLength'HTTP参数或超时。在SO中没有找到任何内容,也尝试了Google here建议的代码并遇到了同样的问题。我不确定如何进一步调试这个,我看到输入流干了并返回'-1'(在'readStream'中尝试了不同的maxLength块并得到了更小的块,但最后仍然干涸),所以我假设它是URLConnection没有交付。或者它可能是我的输入流代码有问题?顺便说一下,这是一个https网址,但由于我确实得到了一些初始数据,我认为这不是一个协议问题(希望我能有点智能地总结一下......)

1 个答案:

答案 0 :(得分:0)

在线程中运行代码而不是在主线程上运行代码是一种很好的做法。 另外请将此添加到您的请求中:

httpURLConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36");
httpURLConnection.setRequestProperty("Accept-Charset", "UTF-8");
httpURLConnection.setDoInput(true);
httpURLConnection.setDoOutput(true);

然后检查响应代码:

if (responseCode == HttpURLConnection.HTTP_OK) {
}

不要忘记将Internet权限添加到清单文件中:

<uses-permission android:name="android.permission.INTERNET" />