2010-08-26 300 views
8

我想從我們的服務器得到一個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/

謝謝。

+0

你確定服務器當前返回整個事情請投票嗎?您可以使用http://code.google.com/p/rest-client/之類的內容點擊它並查看完整回覆。 – 2010-08-26 22:52:24

+0

是的,我確信服務器正在返回整個事情,我從瀏覽器中測試它,它確實返回整個JSON。 – achie 2010-08-26 23:08:03

+0

儘管其相當晚,但可能會幫助其他人 我使用此代碼來顯示在同一網站上找到的完整代碼 int MaxLogSize = 1000; (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)); }' – 2016-06-04 03:57:04

回答

13

第一。

我剛剛發現問題不在於我的代碼,而是logcat顯示的行數。 問題是我的json回覆格式出現問題,我的解析代碼吐出一個錯誤。所以我開始試圖通過在logcat中打印響應json字符串來進行調試。這總是被截斷,直到現在我還在猜測服務器本身的響應被截斷了。

所以今天我開始玩響應字符串生成器,並且必須編寫有趣的片段來計算字符並檢測我期待的位置上的字符,並且我發現響應完全返回。 我還在其他一些大的刺激上測試了我的代碼,並且發現logcat對它顯示的字符串的長度有限制,或者至少它看起來如此。這就是爲什麼我的迴應顯示爲截斷字符串,我認爲它與我的代碼的問題。

所以它工作正常,因爲代碼更早,唯一的問題是 logcat不顯示完整的字符串。但它不 打擾我[至少現在]。

再次感謝大家的努力幫助。

1

使用BasicResponseHandler

這個例子演示了使用 響應處理程序如何 處理HTTP響應。這是 推薦的執行HTTP 請求和處理HTTP 響應的方式。這種方法使 調用者能夠專注於消化HTTP響應的過程 ,並致力於將 系統資源的任務委託給HttpClient。使用 HTTP響應保證在所有情況下自動發佈 底層HTTP連接 自動回到連接 管理器。

+0

我也試過這個。但是我再次嘗試過,只是爲了重新檢查,甚至創建了一個新的應用程序來檢查它,它仍然在做同樣的事情。 返回的字符串的長度始終爲5524 – achie 2010-08-26 23:49:34

1

服務器可能會告訴您的瀏覽器和您的應用程序之間的區別,並且做出不同的響應。

打開您的Java代碼以打印出請求和響應標題,並將它們與使用瀏覽器時獲得的標題進行比較。

也嘗試使用curl和/或wget從命令行執行請求。這些給你更多的信息,以及設置請求頭的能力。

0

String line = reader.readLine();

我相信你的程序中的上述行是問題。它從服務器響應和String行讀取一行。 如果服務器響應中有一個換行符(\ n),那麼閱讀器將無法讀取該行。

使用以下方法來避免..

如果(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)); 

     } 
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)); 
} 

如果發現有幫助:)