如何在 Android 中通过 JSON API 提交评论后准确获取响应状态

使用 okhttp 调用 wordpress json api 提交评论时,需通过 `response.issuccessful()` 判断 http 状态码(如 200/400/500),而非仅依赖异常捕获,才能正确提示用户提交成功或失败。

在 Android 开发中,通过 OkHttp 向 WordPress JSON API(如 ?json=respond/submit_comment)提交评论时,一个常见误区是:仅靠 try-catch 捕获 IOException 来判断请求是否失败。实际上,OkHttp 的 response.execute() 在遇到 HTTP 错误(例如 400 Bad Request、403 Forbidden、500 Internal Server Error)时不会抛出异常——它只在网络连接中断、DNS 失败、超时等底层网络问题时才触发异常。因此,你看到 "Comment Failed" 日志从未打印,正是因为服务端返回了 HTTP 错误码(如 400),但代码未做状态校验。

✅ 正确做法是:始终检查 Response.isSuccessful()(等价于 response.code() >= 200 && response.code()

OkHttpClient httpClient = new OkHttpClient();
String url = "https://www.sikhnama.com/?json=respond/submit_comment" +
        "&post_id=" + Postid +
        "&name=" + URLEncoder.encode(name, "UTF-8") +
        "&email=" + URLEncoder.encode(email, "UTF-8") +
        "&content=" + URLEncoder.encode(comment, "UTF-8");

Request request = new Request.Builder()
        .url(url)
        .get()
        .build();

try {
    Response response = httpClient.newCall(request).execute();
    runOnUiThread(() -> {
        if (response.isSuccessful()) {
            Toast.makeText(getApplicationContext(), "评论提交成功!", Toast.LENGTH_SHORT).show();
        } else {
            // 服务端返回非 2xx 状态码(如 400、401、500)
            int

statusCode = response.code(); String errorMsg = "评论失败(HTTP " + statusCode + ")"; Toast.makeText(getApplicationContext(), errorMsg, Toast.LENGTH_LONG).show(); Log.e("Comment", "HTTP error: " + statusCode + ", body: " + response.body().string()); } }); } catch (IOException e) { // 仅处理真正的网络异常(无网、超时、连接重置等) e.printStackTrace(); runOnUiThread(() -> { Toast.makeText(getApplicationContext(), "网络错误,请检查网络连接", Toast.LENGTH_LONG).show(); Log.e("Comment", "Network failure", e); }); }

⚠️ 关键注意事项:

  • 务必对 URL 参数进行 URLEncoder.encode():否则含空格、中文、特殊符号的 name/email/comment 会导致 URL 解析失败,服务端可能直接返回 400;
  • 避免在主线程解析 response.body().string():示例中为简洁演示放在 runOnUiThread 内,实际应先在后台线程读取 body.string() 并缓存,再切回主线程更新 UI;
  • WordPress JSON API 已弃用:该插件(json-api)早已停止维护,建议迁移到官方 REST API(/wp-json/wp/v2/comments),支持标准 JWT/OAuth 认证与更完善的错误结构;
  • 增强健壮性:可进一步解析响应 JSON(如 {"status":"ok","comment_id":123} 或 {"error":"invalid_email"}),提供更精准的用户提示。

总结:HTTP 请求的成功 ≠ 业务逻辑的成功。isSuccessful() 是判断服务端是否正常响应的第一道关卡,配合状态码与响应体解析,才能构建可靠、友好的用户反馈机制。