2010-08-26 12 views
8

मैं अपने सर्वर से JSON प्रतिक्रिया प्राप्त करने का प्रयास कर रहा हूं और स्ट्रिंग की लंबाई लगभग 5525 वर्णों तक पहुंचने पर प्रतिक्रिया स्ट्रिंग को हमेशा छोटा कर दिया जाता है।स्ट्रिंग को छोटा कर दिया जा रहा है जब यह बहुत लंबा

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

मैंने एचटीपीईएनटीटी का उपयोग करके और प्रतिक्रिया स्ट्रीम पढ़ने का भी प्रयास किया। लेकिन यह लगभग लंबाई में स्ट्रिंग को भी छोटा करता है।

  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/ जैसे कुछ का उपयोग कर सकते हैं। –

+0

हाँ मुझे यकीन है कि सर्वर पूरी चीज वापस कर रहा है, मैंने इसे अपने ब्राउज़र से परीक्षण किया और यह पूरे जेसन को वापस कर देता है। – achie

+0

हालांकि यह काफी देर हो चुकी है लेकिन किसी और की मदद कर सकती है मैंने इस कोड का उपयोग उसी साइट पर कहीं भी मिले पूर्ण कोड को प्रदर्शित करने के लिए किया था 'int maxLogSize = 1000; (int i = 0; i <= veryLongString.length()/maxLogSize; i ++) { int start = i * maxLogSize; < int end = (i + 1) * maxLogSize; अंत = अंत> veryLongString.length()? veryLongString.length(): अंत; Log.v (TAG, veryLongString.substring (प्रारंभ, अंत)); } ' –

उत्तर

13

पहले।

मुझे अभी पता चला है कि समस्या मेरे कोड के साथ नहीं है लेकिन लॉगकैट प्रदर्शित करने वाली रेखाओं की संख्या के साथ है। समस्या यह थी कि मुझे अपने जेसन उत्तर प्रारूप में कोई समस्या मिली और मेरा पार्सिंग कोड एक त्रुटि थूकता है। इसलिए मैंने लॉगकैट में प्रतिक्रिया जेसन स्ट्रिंग को प्रिंट करके इसे डीबग करने का प्रयास करना शुरू कर दिया। इसे हमेशा छोटा कर दिया जा रहा है और मैं अब तक अनुमान लगा रहा था कि सर्वर से प्रतिक्रिया को छोटा कर दिया जा रहा है।

तो आज मैंने प्रतिक्रिया स्ट्रिंग बिल्डर के साथ खेलना शुरू किया और पात्रों की गिनती करने के लिए मजाकिया स्निपेट लिखना और उन पदों पर पात्रों का पता लगाना था जिनकी मुझे उम्मीद थी और मुझे पता चला कि प्रतिक्रिया पूरी तरह से वापस आ रही है। मैंने कुछ अन्य बड़े डंकों पर भी अपने कोड का परीक्षण किया और मुझे पता चला कि लॉगकैट की स्ट्रिंग की लंबाई पर एक सीमा है जो इसे प्रदर्शित करती है या कम से कम इसे देखा जाता है। यही कारण है कि मेरी प्रतिक्रियाओं को कटा हुआ तारों के रूप में प्रदर्शित किया जा रहा था और मैंने सोचा कि यह मेरे कोड के साथ समस्या है।

तो यह ठीक काम कर रहा है क्योंकि कोड पहले है और केवल समस्या थी कि लॉगकैट पूरी स्ट्रिंग प्रदर्शित नहीं करता है। लेकिन यह मुझे परेशान नहीं करता है [कम से कम अभी]।

फिर से मदद करने की कोशिश करने के लिए सभी को धन्यवाद।

1

उपयोग एक BasicResponseHandler:

यह उदाहरण दर्शाता है कि कैसे करने के लिए प्रक्रिया HTTP एक प्रतिक्रिया हैंडलर का उपयोग कर प्रतिक्रियाओं। यह HTTP निष्पादित करने और HTTP प्रतिक्रियाओं को संसाधित करने का अनुशंसित तरीका है। यह दृष्टिकोण कॉलर को HTTP प्रतिक्रियाओं को पचाने की प्रक्रिया पर ध्यान केंद्रित करने के लिए सक्षम बनाता है और सिस्टम संसाधन HttpClient को हटाने के कार्य को प्रतिनिधि करता है। का उपयोग एक HTTP प्रतिक्रिया गारंटी देता है कि अंतर्निहित HTTP कनेक्शन कनेक्शन कनेक्शन पर स्वचालित रूप से सभी मामलों में जारी किया जाएगा।

+0

मैंने इसे भी आजमाया। लेकिन मैंने इसे दोबारा जांचने के लिए फिर से कोशिश की और यहां तक ​​कि इसे जांचने के लिए एक नया ऐप भी बनाया और यह अभी भी वही काम कर रहा है। लौटाई गई स्ट्रिंग की लंबाई हमेशा 5524 है – achie

1

यह संभव है कि सर्वर आपके ब्राउज़र और आपके एप्लिकेशन के बीच अंतर बता सकता है और अलग-अलग प्रतिक्रिया दे रहा है।

अनुरोध और प्रतिक्रिया शीर्षलेख मुद्रित करने के लिए अपने जावा कोड को हैक करें, और अपने ब्राउज़र का उपयोग करते समय प्राप्त शीर्षलेखों के साथ उनकी तुलना करें।

कमांड लाइन से curl और/या wget का उपयोग करके अनुरोध करने का प्रयास करें। ये आपको बहुत अधिक जानकारी देते हैं, साथ ही अनुरोध शीर्षलेख सेट करने की क्षमता भी देते हैं।

0

स्ट्रिंग लाइन = reader.readLine();

मेरा मानना ​​है कि आपके कार्यक्रम में उपर्युक्त रेखा समस्या है। यह सर्वर प्रतिक्रिया और स्ट्रिंग लाइन से एक पंक्ति पढ़ता है। यदि सर्वर प्रतिक्रिया में एक लाइन फ़ीड है (\ n) तो पाठक इसके बाद लाइन को पढ़ने में सक्षम नहीं होगा।

कि बचने के लिए निम्नलिखित का उपयोग ..

अगर (प्रतिक्रिया कोड == 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

हालांकि यह काफी देर हो चुकी है लेकिन किसी और की मदद कर सकती है मैंने इस कोड का उपयोग पूरे लंबे स्ट्रिंग को प्रदर्शित करने के लिए किया था। एक ही साइट पर कहीं मिले

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

कृपया वोट यदि उपयोगी :)

संबंधित मुद्दे