6 Stimmen

Android HttpResponse - Inhalt wurde konsumiert

Die unten stehende Methode fällt beim Lesen der HttpResponse mit dem Fehler um: "Der Inhalt wurde konsumiert". Ich verstehe, dass der Inhalt nur einmal konsumiert werden kann, aber ich erhalte diesen Fehler beim allerersten Versuch und ich sehe nirgendwo im Code, wo ich ihn möglicherweise zweimal konsumieren würde.

    private static String getData(String url, HttpParams params) {
    StringBuilder builder = new StringBuilder();
        HttpClient client = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(url);
        if (params != null) {
            httpGet.setParams(params);
        }
        String result = "";
        try {
            HttpResponse response = client.execute(httpGet);
            StatusLine statusLine = response.getStatusLine();
            int statusCode = statusLine.getStatusCode();
            if (statusCode == 200) {
                HttpEntity entity = response.getEntity();
                InputStream content = entity.getContent();
                BufferedReader reader = new BufferedReader(new InputStreamReader(content));
                String line;
                while ((line = reader.readLine()) != null) {
                    builder.append(line);
                }
                content.close();
                result = builder.toString();
            } 
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    return result;  
    }

6voto

uris Punkte 5769

Vergewissern Sie sich, dass Sie in der Eclipse-Überwachungsansicht nicht etwas haben wie http_response.getEntity() Wenn ja, dann ist es das, was Ihren Stream auffrisst...

2voto

Zayin Krige Punkte 3091

Ist das im Emulator oder auf Ihrem Telefon? Es könnte ein emulatorspezifisches Problem sein. Ich habe es auf meinem Gerät getestet, und es funktioniert perfekt.

Haben Sie vielleicht eine Debugger-Überwachung, die den Inhalt abrufen könnte?

2voto

dwbrito Punkte 5008

Dies kann passieren, wenn Sie die Entität mehr als einmal konsumieren, in einem ähnlichen Aufruf wie diesem:

EntityUtils.toString(entity, HTTP.UTF_8))

1voto

Sandy Punkte 985

Ihre get Data()-Methode ist perfekt und es funktioniert gut, ich habe bereits diesen Code verwendet, um zu überprüfen, und es funktioniert perfekt für mich.

so könnte es eine Möglichkeit, dass Sie diese Methode zweimal aufgerufen. wenn Sie überprüfen möchten, was ich m mit Check unten Code ich Ergebnis perfekt erhalten.

package com.sandeeppatel.httpget;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.app.Activity;
import android.os.Bundle;

public class HttpGetActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    StringBuilder builder = new StringBuilder();
    HttpClient client = new DefaultHttpClient();
    HttpGet httpGet = new HttpGet("http://www.vogella.com");
    /*if (params != null) {
        httpGet.setParams(params);
    }*/
    String result = "";
    try {
        HttpResponse response = client.execute(httpGet);
        StatusLine statusLine = response.getStatusLine();
        int statusCode = statusLine.getStatusCode();
        if (statusCode == 200) {
            HttpEntity entity = response.getEntity();
            InputStream content = entity.getContent();
            BufferedReader reader = new BufferedReader(new InputStreamReader(content));
            String line;
            while ((line = reader.readLine()) != null) {
                builder.append(line);
            }
            content.close();
            result = builder.toString();
        } 
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }
 // return result;  
}
}

Und ich gebe nur die Erlaubnis für das Internet. Trotzdem, wenn Sie das nicht bekommen, geben Sie mir Ihre Url und Params.

1voto

Rajiv yadav Punkte 823

Ich denke, Ihr Code ist richtig. aber versuchen Sie dies, um String von HttpEntity zugreifen: String response_str =EntityUtils.toString(responseEntity, HTTP.UTF_8);

wie ich sie in meiner Methode verwendet habe:

    public String SetObjectSecurity(String username, String password,
        String clientName,String docRid,String ObjectRidsForCheckSum) throws JSONException, ClientProtocolException, IOException
{
    String SetObjectSecurityURL = "url";
    StringEntity str_request_entity = null;
    HttpResponse http_response = null;

    HttpGet getrequest = new HttpGet(SetObjectSecurityURL);
    postrequest.setHeader("Accept", "application/json");
    postrequest.setHeader("Content-type", "application/json");
//set param here

    HttpClient httpClient = new DefaultHttpClient();

    http_response = httpClient.execute(getrequest);

    //Log.e("Status code ",http_response);
    HttpEntity responseEntity = http_response.getEntity();

    String response_str =EntityUtils.toString(responseEntity, HTTP.UTF_8);
    Log.e("output",response_str);
    int i = http_response.getStatusLine().getStatusCode();
    Log.e("status","code "+i);

if(i==this){

do this}
else
{
this
}       
        return response_str;
        }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X