okhttp 响应主体“不可用”,尽管其他客户端能够这样做

问题描述 投票:0回答:0

我使用 OKHTTP 库创建了一个简单的 Web 服务器来测试 Android Studio 上的 GET 和 POST 请求。我从中 ping 数据的初始服务器在 Node/Express 上运行并且与 Android Studio 通信良好,但是当我将服务器移动到 ESP8266 时,它在响应中发送相同的数据,我正在构建的应用程序会突然崩溃。找到下面粘贴的 GET 请求的完整源代码:

public void getStatus () {
        Request request = new Request.Builder().url(BASE_URL).build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(@NonNull Call call, @NonNull IOException e) {
                e.printStackTrace();
            }

            @Override
            public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            assert response.body() != null;
                            String rawData = response.body().string();
                            JSONObject rsp = new JSONObject(rawData);
                            lightState = rsp.getJSONObject("data").getBoolean("status");
                            textView.setText(String.valueOf(lightState));
                            buttonPost.setBackground(lightState ? lightOn : lightOff);
                        }
                        catch (IOException e) {
                            e.printStackTrace();
                        }
                        catch (JSONException e) {
                            throw new RuntimeException(e);
                        }
                    }
                });
            }
        });

    }

在使用 Android Studio 调试工具仔细检查后,我意识到是

String rawData = response.body().string();
行会导致致命异常。这让我找到了网络工具,它显示响应正文显示为“不可用”: Android Studio Network Response

这对我来说很特别,因为我用来发送请求的所有其他客户端(Chrome、Thunder Client、cURL)都产生了预期的响应: Thunder Client Response

Chrome Response Chrome Response 2

cURL Response

这对我来说毫无意义,让我相信我在 Android Studio 中的代码一定有问题。

非常感谢任何帮助,因为我不知道从这里去哪里。干杯!

编辑:我实现了 HttpLoggingInterceptor,但我很困惑,因为 Logcat 条目确实显示了我期望的数据。

2023-04-26 21:11:49.786 28252-30711 okhttp.OkHttpClient     com.example.myapplication            I  --> GET http://BASE_URL
2023-04-26 21:11:49.787 28252-30711 okhttp.OkHttpClient     com.example.myapplication            I  --> END GET
2023-04-26 21:11:50.023 28252-30711 okhttp.OkHttpClient     com.example.myapplication            I  <-- 200 OK http://BASE_URL (235ms)
2023-04-26 21:11:50.024 28252-30711 okhttp.OkHttpClient     com.example.myapplication            I  Content-Type: text/plain; charset=utf-8
2023-04-26 21:11:50.024 28252-30711 okhttp.OkHttpClient     com.example.myapplication            I  Content-Length: 73
2023-04-26 21:11:50.025 28252-30711 okhttp.OkHttpClient     com.example.myapplication            I  Access-Control-Allow-Origin: *
2023-04-26 21:11:50.025 28252-30711 okhttp.OkHttpClient     com.example.myapplication            I  Connection: keep-alive
2023-04-26 21:11:50.026 28252-30711 okhttp.OkHttpClient     com.example.myapplication            I  Keep-Alive: timeout=2000
2023-04-26 21:11:50.037 28252-30711 okhttp.OkHttpClient     com.example.myapplication            I  {"success":false,"error":"method not allowed","data":{"status":"denied"}}
2023-04-26 21:11:50.037 28252-30711 okhttp.OkHttpClient     com.example.myapplication            I  <-- END HTTP (73-byte body)

编辑 2:我注意到虽然我附加了拦截器,但请求是成功的。删除它并使用构建器仍然会导致应用程序崩溃。

java android okhttp
© www.soinside.com 2019 - 2024. All rights reserved.