
使用 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() 是判断服务端是否正常响应的第一道关卡,配合状态码与响应体解析,才能构建可靠、友好的用户反馈机制。









