web-dev-qa-db-ja.com

OkHttpのresponse.body.toString()を取得して文字列を返すことができません

OkHttpを使用してjsonデータを取得しようとしていますが、response.body().toString()を記録しようとすると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

ここで何が間違っているのかわかりません。応答文字列を取得するにはどうすればよいですか?

57
freddieptf

.string()関数を使用して、応答をSystem.out.println()に出力します。しかし、最後にLog.i().toString()を使用しています。

そのため、応答本文で.string()を使用して、次のように要求の応答を印刷して取得してください。

response.body().string();

注:

  1. .toString():これは、オブジェクトを文字列形式で返します。

  2. .string():これは応答を返します。

これで問題が解決すると思います...そうです。

199
V.J.

誰かが私と同じ奇妙なことにぶつかった場合に備えて。開発中にデバッグモードでコードを実行し、明らかにOKHttp 2.4以降

..応答本文は1回限りの値であり、1回のみ使用できます

したがって、デバッグ時には、インスペクターから「舞台裏」の呼び出しがあり、ボディは常に空です。参照: https://square.github.io/okhttp/3.x/okhttp/okhttp3/ResponseBody.html

24
Oded Regev

response.body,.string()は1回のみ使用できます。以下として使用してください:

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

たとえば、次のように変更してみてください。

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