You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();

额外说明

  1. URL编码问题:直接拼接URL会导致评论里的空格、中文等特殊字符出现编码错误,HttpUrl.Builder会自动处理参数编码,避免请求失败。
  2. 响应体关闭:调用response.body().string()后必须关闭响应体,否则会占用OkHttp连接池资源,导致后续请求异常。
  3. 接口返回格式:不同WordPress JSON插件的返回字段可能略有差异,你可以用Postman测试接口,确认返回的JSON字段后再调整解析逻辑。
  4. 线程规范:网络请求必须放在子线程执行,原代码在主线程执行网络请求会导致ANR(应用无响应),这是Android开发的基础规范。

内容的提问来源于stack exchange,提问作者noorapps

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 19:30:37