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
相关产品推荐
相关产品推荐

