字符串在太长时间内被截断

时间:2010-08-26 22:29:05

标签: java android httpclient

我正在尝试从我们的服务器获取JSON响应,并且当字符串长度达到大约5525个字符时,响应字符串似乎总是被截断。

HttpClient httpClient = new DefaultHttpClient();
HttpPost post = new HttpPost(URL);
ResponseHandler<String> responseHandler= new BasicResponseHandler();
String testResponse = httpClient.execute(post, responseHandler);

我还尝试使用HttpEntity并读取响应流。但是这也会在大约那个长度截断字符串。

            HttpClient httpClient = new DefaultHttpClient();
            HttpPost post = new HttpPost(URL);
//          HttpGet get = new HttpGet(URL);

            HttpResponse response = null;
            HttpEntity entity = null;
            InputStream inputStream = null;
            BufferedReader reader = null;
            String result = "";
            try {
                response = (HttpResponse)httpClient.execute(post);
                entity = response.getEntity();
                if(entity != null){
                    inputStream = entity.getContent();
                }
                reader = new BufferedReader(new InputStreamReader(inputStream), 8000);
                StringBuffer builder = new StringBuffer("");
                String line = reader.readLine();
                while(line != null){
                    Log.v(tag, "int max::::::::: "+Integer.MAX_VALUE);
                    Log.v(tag, "LINE::::::::: "+line+reader.toString());
                    Log.v(tag, "reader::::::::: "+reader.toString());
                    builder.append(line+"\n");
                    line = reader.readLine();
                }
                inputStream.close();
                result = builder.toString();
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally{
                if(inputStream != null){
                    try{
                        inputStream.close();
                    }catch(IOException e){
                        e.printStackTrace();
                    }
                }
            }

请告诉我如何处理这个问题。 我在创建它时使用这篇文章作为参考。 http://senior.ceng.metu.edu.tr/2009/praeda/2009/01/11/a-simple-restful-client-at-android/

谢谢。

5 个答案:

答案 0 :(得分:14)

首先感谢大家的回复。

我刚刚发现问题不在于我的代码,而在于logcat显示的行数。 问题是我的json回复格式出现问题,我的解析代码出错了。所以我开始尝试通过在logcat中打印响应json字符串来调试它。这总是被截断,我猜到现在服务器本身的响应被截断了。

所以今天我开始玩响应字符串构建器,并且必须编写有趣的片段来计算字符并检测我期待的位置上的字符,并且我发现响应完全被返回。 我还在其他一些大型测试中测试了我的代码,我发现logcat对它显示的字符串的长度有限制,或者至少看起来如此。这就是为什么我的回复显示为截断的字符串,我认为这是我的代码的问题。

因为代码更早,所以它工作正常,唯一的问题是 logcat不显示完整的字符串。但事实并非如此 打扰我[至少现在]。

再次感谢大家的帮助。

答案 1 :(得分:2)

使用BasicResponseHandler

  

此示例演示如何操作   使用a处理HTTP响应   响应处理程序这是   推荐的执行HTTP的方法   请求和处理HTTP   响应。这种方法可以实现   调用者专注于这个过程   消化HTTP响应和   委派系统资源的任务   释放到HttpClient。指某东西的用途   HTTP响应保证了   底层HTTP连接将是   释放回连接   经理自动在所有情况下。

答案 2 :(得分:1)

服务器可能会区分您的浏览器和您的应用程序,并且响应方式不同。

破解Java代码以打印出请求和响应标头,并将它们与使用浏览器时获得的标头进行比较。

还可以尝试使用命令行中的curl和/或wget来执行请求。这些可以为您提供更多信息,以及设置请求标头的功能。

答案 3 :(得分:0)

String line = reader.readLine();

我相信程序中的上述行是问题所在。它从服务器响应和String行读取一行。 如果服务器响应有换行符(\ n),则读者将无法读取该行。

使用以下内容来避免..

if(responseCode == HttpURLConnection.HTTP_OK){

            InputStream in = ((URLConnection) httpConnection).getInputStream();
            int len = 0;


            byte[] data1 = new byte[1024];
            while ( -1 != (len = in.read(data1)) )
                dataFromServer.append(new String(data1, 0, len));

        }

答案 4 :(得分:0)

虽然它很晚但可能会帮助别人 我使用此代码显示完整的LONG字符串。找到同一网站的某个地方

int maxLogSize = 1000;
for(int i = 0; i <= veryLongString.length() / maxLogSize; i++) {
    int start = i * maxLogSize;<
    int end = (i+1) * maxLogSize;
    end = end > veryLongString.length() ? veryLongString.length() : end;
    Log.v(TAG, veryLongString.substring(start, end));
}

如果发现有帮助请投票:)