2011-07-28 9 views
42

httpレスポンスを以下のコードを使用して文字列に変換しようとしていますが、レスポンス文字列が途中で終了してしまいました。httpレスポンスを文字列に変換する方法。HttpResponse to String 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(); 
} 

誰でも助けてください。 おかげで Deepesh

+0

こんにちは、また、問題は、私はこれをしなかった – Max

答えて

109

を使用することができますが、もっと簡単な方法がありますか?

+4

これは、convertStreamToString *の1行の代わりですが、バッファを消費します!これは、実際の処理を行うために、ログを2行で呼び出すことはできません。あなたは後者を持つために前者にコメントする必要があります。 – denispyr

+0

@denispyrあなたはどういう意味ですか?あなたはそれを説明できますか?あなたはそれをどこで読んだのですか? – Nikhil

+0

@Nikhil私はresp_entityが無効になることを意味します(空ですか?私は今思い出すことができません)。私はどこにでもそれを読んでいない、私は実際の処理の前にログオンしたときに私はそれに墜落した。何か変わった? – denispyr

24

このような応答のInputStream取得:

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

は、この方法を試してみてください:

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

....だから何が解決する必要がありますカントが大きな値を保持するバッファである...しかし、私の応答はバッファ大きいためそれを保持していない、私は文字列でそれを保持しようとしていたまた、それはrandaomlyを終了しています...任意のアイデア – Max

+0

ええと、あなたは応答を分割するあなたのWebサービスを変更できますか?ちょうどページネーションのように、最初のリクエストアイテム1 - 50、次に51 - 100。 – ayublin

+0

@ ayublin私はそれを行うことはできません...私の要求はplistなので、私は応答を壊すならば、それをサポートしません。応答の権利としてデータの巨大な文字列を格納する何らかの方法が必要ですか? – 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); 

これはHTTPPOSTのコードであるあなたが応答を取得することができ、これを使用して文字列。

String result = EntityUtils.toString(resp_entity); 

右:

サーバーへのクエリ文字列を渡す必要があれば、あなたは私が思うnameValuePairs

+1

私はほとんどすべてのオプションを使って問題を解決しました私のバッファは応答を保持することができないし、あまりにも本当に大きな文字列ではありません...私はyはこれが起こっていることを理解していない私はまた、問題を与えるdoesntのiPhoneアプリを書いて... – Max

+0

あなたの応答は非常に大きな文字列に格納するのではなく、直接入力ストリームを読み取る必要があります。 – Dharmendra

+0

@djrecker - これを解決しましたか?私はAndroidでは同じ問題を抱えていますが、iPhoneではありません。あなたと同じ問題。あなたはAndroidのためのすべての応答を得るために何をすべきかを決心しましたか? – Patricia

12
HttpResponse response = http.execute(httpMethod); 
int responseCode = response.getStatusLine().getStatusCode(); 
switch(responseCode) { 
case 200: 
HttpEntity entity = response.getEntity(); 
    if(entity != null) { 
     String responseBody = EntityUtils.toString(entity); 
    } 
    break; 
} 

あなたがエンコーディングを処理し、レスポンスをgzip圧縮され、これを行うための、より堅牢な方法を探しているなら、この試すhttp://cdrussell.blogspot.com.es/2011/12/android-get-body-of-http-response-as.html

3

を参照してください:あなたは代わりのHttpResponseの応答を持っている場合

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

うまくいきました – Munir

-1

を。このようにステータスコードを取得することができます。ありがとう

final int statusCode = response.code(); 
0

これを試してみる人もいます。私はそれをテストし、適切に動作しています。

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; 

}