web-dev-qa-db-fra.com

Impossible d'obtenir la réponse.body.toString () d'OkHttp pour renvoyer une chaîne

J'essaie d'obtenir des données JSON en utilisant OkHttp et je ne peux pas comprendre pourquoi, lorsque j'essaie d'enregistrer la response.body().toString(), ce que j'obtiens est Results:﹕ com.squareup.okhttp.Call$RealResponseBody@41c16aa8

try {
        URL url = new URL(BaseUrl);
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(url)
                .header(/****/)
                .build();

        Call call = client.newCall(request);
        Response response = call.execute();

        **//for some reason this successfully prints out the response**
        System.out.println("YEAH: " + response.body().string());

        if(!response.isSuccessful()) {
            Log.i("Response code", " " + response.code());
        }

        Log.i("Response code", response.code() + " ");
        String results = response.body().toString();

        Log.i("OkHTTP Results: ", results);

Log

Je ne sais pas ce que je fais mal ici. Comment puis-je obtenir la chaîne de réponse?

57
freddieptf

Vous devez utiliser la fonction .string() pour imprimer la réponse dans System.out.println(). Mais enfin, dans Log.i(), vous utilisez .toString().

Veuillez donc utiliser .string() sur le corps de la réponse pour imprimer et obtenir la réponse de votre demande, comme:

response.body().string();

NOTE:

  1. .toString(): Ceci retourne votre objet au format chaîne.

  2. .string(): Ceci retourne votre réponse.

Je pense que cela résoudra votre problème ... Bien.

199
V.J.

Juste au cas où quelqu'un tomberait sur la même chose étrange que moi. J'exécute mon code pendant le développement en mode débogage et apparemment depuis OKHttp 2.4

..le corps de la réponse est une valeur unique ne pouvant être consommée qu'une seule fois

Ainsi, lors du débogage, un appel "en arrière-plan" de l'inspecteur est émis et le corps est toujours vide. Voir: https://square.github.io/okhttp/3.x/okhttp/okhttp3/ResponseBody.html

24
Oded Regev

La response.body,.string() ne peut être consommée qu'une seule fois. Veuillez utiliser comme ci-dessous:

String responseBodyString = response.body.string();
use the responseBodyString as needed in your application.
8
Nethaji Narasimalu

essayez de le changer comme ça par exemple:

protected String doInBackground(String... params) {
            try {
                JSONObject root = new JSONObject();
                JSONObject data = new JSONObject();
                data.put("type", type);
                data.put("message", message);
                data.put("title", title);
                data.put("image_url", imageUrl);
                data.put("uid",uid);
                data.put("id", id);
                data.put("message_id", messageId);
                data.put("display_name", displayName);
                root.put("data", data);
                root.put("registration_ids", new JSONArray(receipts));
                RequestBody body = RequestBody.create(JSON, root.toString());
                Request request = new Request.Builder()
                        .url(URL)
                        .post(body)
                        .addHeader("Authorization", "key=" + serverKey)
                        .build();
                Response response = mClient.newCall(request).execute();
                String result = response.body().string();
                Log.d(TAG, "Result: " + result);
                return result;
            } catch (Exception ex) {
                Log.e(TAG,"Exception -> "+ex.getMessage());
            }
            return null;
        }
0
Aoun allah Billel