Android Studio中使用JSON API添加评论时如何获取提交状态?
解决WordPress评论提交的结果判断与异常日志问题
你的问题核心在于:OkHttp的IOException仅在网络层面出错时触发(比如无网络、连接超时、服务器不可达),如果服务器正常返回了响应(哪怕是错误状态码,比如400参数错误、500服务器内部错误),execute()不会抛出异常,所以你的catch块根本不会执行,自然看不到"Comment Failed"日志。
另外,你当前的代码不管请求结果如何,都只显示固定Toast,用户无法知道评论是否真的提交成功。下面是修改后的完整解决方案:
关键修改点
- 先判断HTTP响应是否成功(状态码200-299)
- 解析WordPress返回的JSON响应,确认评论是否真正提交成功
- 完善异常捕获,覆盖网络异常和JSON解析异常
- 根据实际结果给用户显示对应的提示
修改后的代码
OkHttpClient httpClient = new OkHttpClient(); // 用HttpUrl.Builder构建URL,自动处理参数编码,避免特殊字符导致请求失败 HttpUrl url = new HttpUrl.Builder() .scheme("https") .host("www.sikhnama.com") .addQueryParameter("json", "respond/submit_comment") .addQueryParameter("post_id", Postid) .addQueryParameter("name", name) .addQueryParameter("email", email) .addQueryParameter("content", comment) .build(); Request request = new Request.Builder() .url(url) .build(); // 网络请求必须放在子线程,避免阻塞主线程 new Thread(() -> { try { Response response = httpClient.newCall(request).execute(); // 判断HTTP响应是否成功 if (response.isSuccessful()) { // 读取响应体并关闭,避免资源泄漏 String responseBody = response.body().string(); response.close(); // 解析WordPress返回的JSON结果 JSONObject jsonResponse = new JSONObject(responseBody); // 多数WordPress JSON接口会返回status字段标识结果 String status = jsonResponse.getString("status"); if ("success".equals(status)) { runOnUiThread(() -> Toast.makeText(getApplicationContext(), "评论提交成功!", Toast.LENGTH_SHORT).show()); } else { // 获取错误提示,没有则用默认文案 String errorMsg = jsonResponse.optString("error", "提交失败,请稍后重试"); runOnUiThread(() -> Toast.makeText(getApplicationContext(), errorMsg, Toast.LENGTH_SHORT).show()); Log.d("Comment", "提交失败:" + errorMsg); } } else { // HTTP状态码错误,比如400参数错误、500服务器异常 runOnUiThread(() -> Toast.makeText(getApplicationContext(), "服务器请求失败,状态码:" + response.code(), Toast.LENGTH_SHORT).show()); Log.d("Comment", "HTTP请求失败,状态码:" + response.code()); response.close(); } } catch (IOException e) { // 网络层面错误,比如无网络、连接超时 e.printStackTrace(); runOnUiThread(() -> Toast.makeText(getApplicationContext(), "网络异常,请检查网络连接", Toast.LENGTH_SHORT).show()); Log.d("Comment", "网络请求失败:" + e.getMessage()); } catch (JSONException e) { // JSON解析错误 e.printStackTrace(); runOnUiThread(() -> Toast.makeText(getApplicationContext(), "数据解析失败", Toast.LENGTH_SHORT).show()); Log.d("Comment", "JSON解析失败:" + e.getMessage()); } }).start();
额外说明
- URL编码问题:直接拼接URL会导致评论里的空格、中文等特殊字符出现编码错误,
HttpUrl.Builder会自动处理参数编码,避免请求失败。 - 响应体关闭:调用
response.body().string()后必须关闭响应体,否则会占用OkHttp连接池资源,导致后续请求异常。 - 接口返回格式:不同WordPress JSON插件的返回字段可能略有差异,你可以用Postman测试接口,确认返回的JSON字段后再调整解析逻辑。
- 线程规范:网络请求必须放在子线程执行,原代码在主线程执行网络请求会导致ANR(应用无响应),这是Android开发的基础规范。
内容的提问来源于stack exchange,提问作者noorapps
相关产品推荐
相关产品推荐

