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

Android:如何通过OkHttpClient获取404错误的友好提示信息?

解决OkHttp无法获取HTTP错误友好提示的问题

核心原因

OkHttp 的 response.message() 仅返回服务器在HTTP状态行中明确返回的消息(比如HTTP/1.1 404 Not Found里的Not Found),如果服务器未返回该字段就会为空;而response.body()在非2xx响应时是无效的,需要用response.errorBody()获取错误响应体。另外,若服务器未提供自定义提示,需自行映射标准HTTP状态码对应的友好描述。

解决方案

1. 优先获取服务器返回的状态消息+错误体

先判断响应是否成功,再分别处理状态消息和错误内容:

OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
        .url("目标URL")
        .build();

try (Response response = client.newCall(request).execute()) {
    if (!response.isSuccessful()) {
        // 1. 获取服务器返回的状态消息
        String statusMsg = response.message();
        
        // 2. 若服务器未返回状态消息,使用标准HTTP状态码对应的友好描述
        if (statusMsg == null || statusMsg.trim().isEmpty()) {
            statusMsg = getStandardHttpMessage(response.code());
        }
        
        // 3. 获取服务器返回的错误详情(如果有)
        String errorDetail = null;
        if (response.errorBody() != null) {
            // 注意:errorBody().string()只能调用一次,流会被关闭
            errorDetail = response.errorBody().string();
        }
        
        // 组装给用户的友好提示
        String userMsg = String.format("请求失败:%s(错误码:%d)", statusMsg, response.code());
        if (errorDetail != null && !errorDetail.trim().isEmpty()) {
            userMsg += "\n详情:" + errorDetail;
        }
        
        // 这里将userMsg展示给用户即可
        System.out.println(userMsg);
    } else {
        // 处理成功响应逻辑
        String responseBody = response.body().string();
    }
} catch (IOException e) {
    // 处理网络异常,比如给用户提示"网络连接失败,请检查网络"
    System.out.println("网络连接失败,请检查网络设置");
}

2. 实现标准HTTP状态码映射方法

上面用到的getStandardHttpMessage方法可覆盖常用状态码,提供通用友好描述:

private String getStandardHttpMessage(int code) {
    return switch (code) {
        case 400 -> "请求参数错误";
        case 401 -> "未授权,请登录后重试";
        case 403 -> "无权访问该资源";
        case 404 -> "请求的资源不存在";
        case 405 -> "不支持该请求方式";
        case 500 -> "服务器内部错误";
        case 502 -> "网关错误";
        case 503 -> "服务器暂时不可用";
        default -> String.format("未知错误(错误码:%d)", code);
    };
}

注意事项

  • response.errorBody().string()只能调用一次,若需要多次使用,可先用response.errorBody().bytes()保存字节数组,再转换为字符串。
  • 若服务器返回的错误体是JSON/XML格式,可自行解析提取更友好的提示内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:10:24