我使用 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();
行会导致致命异常。这让我找到了网络工具,它显示响应正文显示为“不可用”:
这对我来说很特别,因为我用来发送请求的所有其他客户端(Chrome、Thunder Client、cURL)都产生了预期的响应:
这对我来说毫无意义,让我相信我在 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:我注意到虽然我附加了拦截器,但请求是成功的。删除它并使用构建器仍然会导致应用程序崩溃。