2011-07-28 11 views
42

Próbuję ukryć odpowiedź http na ciąg znaków za pomocą poniższego kodu, ale mój łańcuch odpowiedzi jest kończony w środku wszelkie pomysły, jak przekonwertować odpowiedź http na ciąg tak, że nie dostaję żadnego problemu z buforem .HttpResponse na ciąg android

private static String convertStreamToString(InputStream is) { 
    BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
    StringBuilder sb = new StringBuilder(); 
    String line = null; 
    try { 
     while ((line = reader.readLine()) != null) { 
      sb.append((line + "\n")); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      is.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    return sb.toString(); 
} 

Wszelkie sugestie proszę o pomoc. Dzięki Deepesh

+0

Cześć, Również problemem jest bufor mogę trzymać tak duże wartości, co powinno być rozwiązaniem .... – Max

Odpowiedz

109

myślę, istnieje prostszy sposób:

String result = EntityUtils.toString(resp_entity); 

prawda?

+4

Jest to jednoliniowy zamiennik dla convertStreamToString *, ale * zużywa bufor! Oznacza to, że nie możesz wywołać go dwa razy (np. W jednym wierszu dla dziennika i w następnym, aby wykonać faktyczne przetwarzanie). Musisz skomentować ten pierwszy, aby mieć drugi. – denispyr

+0

@denispyr co masz na myśli? możesz to wyjaśnić ? gdzie to przeczytałeś? – Nikhil

+0

@Nikhil Mam na myśli, że resp_entity staje się nieważne (puste? Nie pamiętam teraz). Nigdzie go nie czytałem, rozbiłem się na nim, gdy logowałem się przed faktycznym przetwarzaniem. Czy coś się zmieniło? – denispyr

24

Get InputStream odpowiedź tak:

httpResponse = client.execute(request); 
HttpEntity entity = httpResponse.getEntity(); 
InputStream is = entity.getContent(); 

Spróbuj tej metody:

private static String convertStreamToString(InputStream is) { 

    BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
    StringBuilder sb = new StringBuilder(); 

    String line = null; 
    try { 
     while ((line = reader.readLine()) != null) { 
      sb.append((line + "\n")); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      is.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    return sb.toString(); 
} 
+0

Zrobiłem to ... ale od mojej odpowiedzi jest duży bufor nie chwytam tego, próbowałem trzymać go w sznurku, a także kończy się on randaomly ... jakikolwiek pomysł – Max

+0

hmm, czy możesz zmodyfikować swój serwis internetowy, aby podzielić odpowiedź? tak jak w przypadku stronicowania, więc na pierwsze żądanie element 1 - 50, a następnie 51 - 100. – ayublin

+0

@ ayublin Nie mogę tego zrobić ... ponieważ moje żądanie jest plist i potrzebuję pełnej odpowiedzi za jednym razem, jeśli przerwę odpowiedź api nie będę tego wspierać. Musi być jakiś sposób przechowywania ogromnych łańcuchów danych jako odpowiedzi? – Max

6
HttpPost httppost; 
     DefaultHttpClient httpclient; 
     ResponseHandler <String> res=new BasicResponseHandler(); 
     List<NameValuePair> nameValuePairs; 
     String bytesSent; 

     httppost = new HttpPost(URL OF YOUR SITE); 
     HttpParams params = new BasicHttpParams(); 

     HttpProtocolParams.setContentCharset(params, "UTF-8"); 

     httpclient = new DefaultHttpClient(params); 
     nameValuePairs = new ArrayList<NameValuePair>(2); 
     nameValuePairs.add(new BasicNameValuePair("key1", value1)); 
     nameValuePairs.add(new BasicNameValuePair("key2", value2)); 
     nameValuePairs.add(new BasicNameValuePair("key3", value3)); 
     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
     bytesSent = httpclient.execute(httppost, res); 

Jest to kod z HttpPost pomocą tego można uzyskać odpowiedź w Strunowy.

Jeśli trzeba przejść łańcuch zapytania do serwera można użyć nameValuePairs

+1

HI, użyłem prawie wszystkich opcji i zorientowałem się, że problem czy mój bufor nie jest w stanie utrzymać odpowiedzi i to nie jest naprawdę duży ciąg ... Nie rozumiem, że to się dzieje, napisałem aplikację na iPhone'a, która nie daje żadnego problemu ... – Max

+0

Jeśli twoja odpowiedź jest bardzo duże, powinieneś przeczytać strumień wejściowy bezpośrednio zamiast zapisywać go w łańcuchu – Dharmendra

+0

@djrecker - Czy kiedykolwiek rozwiązałeś ten problem? Mam ten sam problem na Androidzie, ale nie na iPhonie. Taki sam problem jak Ty. Czy kiedykolwiek zastanawiałeś się, co zrobić, aby uzyskać całą odpowiedź na Androida? – Patricia

3

Jeśli szukasz bardziej wytrzymałej sposób robienia tego, który obsługuje kodowanie i skompresowane odpowiedzi, spróbuj tego:

String encoding = EntityUtils.getContentCharSet(response.getEntity()); 
encoding = encoding == null ? "UTF-8" : encoding; 
InputStream stream = AndroidHttpClient.getUngzippedContent(response.getEntity()); 
InputStreamEntity unzEntity = new InputStreamEntity(stream,-1); 
String response = EntityUtils.toString(unzEntity, encoding); 
+0

Pracował, fajne rozwiązanie – Munir

-1

Jeśli masz odpowiedź Zamiast HttpResponse. W ten sposób możesz otrzymać kod statusu. Dzięki

final int statusCode = response.code(); 
0

Ktoś może wypróbować ten. Przetestowałem go i działa poprawnie.

public String convertHttpResponseToString(HttpResponse res) { 
    InputStream is=null; 
    String responseString=""; 
    try { 
     is=res.getEntity().getContent(); 
     BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(is)); 
     String line=""; 
     StringBuffer sb=new StringBuffer(); 
     while ((line=bufferedReader.readLine())!=null) 
     { 
     sb.append(line); 
     } 
     responseString=sb.toString(); 
    } catch (Exception e) 
    { 
      // handle Exception here... 
    } 
    return responseString; 

} 
0
private String convertHttpResponseToString(HttpResponse response) throws IOException { 
InputStream responseStream = response.getEntity().getContent(); 
Scanner scanner = new Scanner(responseStream, "UTF-8"); 
String responseString = scanner.useDelimiter("\\Z").next(); 
scanner.close(); 
return responseString; 

}

Powiązane problemy