如何在Android应用中捕获C# MVC API返回的BadRequest错误信息?
如何用OkHttp3捕获C# MVC API返回的BadRequest错误消息
问题背景
你有一段C# MVC API代码,返回BadRequest类型的错误响应:
[System.Web.Http.HttpPost] [System.Web.Http.Route("api/ServiceV1/Test")] public IHttpActionResult Test() { return BadRequest("Catch this message in Android application"); }
在Postman中调用该接口会得到如下JSON响应:
{ "Message": "Catch this message in Android application" }
你当前使用OkHttp3在Android应用中发起请求,但不知道如何捕获这个错误消息,现有请求代码如下:
String MIME_JSON = "application/json"; Gson gson = new Gson(); RequestBody body = RequestBody.create(MediaType.parse(MIME_JSON), gson.toJson(object)); Request request = new Request.Builder() .url(baseUrl + route) .post(body) .build(); okHttpClient.newCall(request).execute();
解决方案
OkHttp的Response对象会包含请求的状态码和响应体,BadRequest对应HTTP 400状态码,不属于response.isSuccessful()(仅覆盖2xx状态码)的成功范围,所以我们需要在非成功分支里解析错误响应体来获取消息。
方法1:用实体类解析(类型安全,推荐)
首先创建一个和API错误响应结构完全匹配的实体类:
public class ErrorResponse { private String Message; // 字段名要和API返回的键严格一致 public String getMessage() { return Message; } public void setMessage(String message) { Message = message; } }
然后修改你的请求代码,添加完整的响应处理逻辑:
try (Response response = okHttpClient.newCall(request).execute()) { if (response.isSuccessful()) { // 处理请求成功的场景 String successBody = response.body().string(); // ... 后续业务逻辑 } else { // 处理非成功响应 if (response.code() == 400) { // 匹配BadRequest的400状态码 String errorBody = response.body().string(); Gson gson = new Gson(); ErrorResponse errorResponse = gson.fromJson(errorBody, ErrorResponse.class); String errorMessage = errorResponse.getMessage(); // 在这里使用错误消息,比如显示Toast或打印日志 Log.d("API_ERROR", "捕获到错误消息:" + errorMessage); } else { // 处理其他错误状态码(比如401未授权、500服务器错误等) Log.d("API_ERROR", "请求失败,状态码:" + response.code()); } } } catch (IOException e) { e.printStackTrace(); // 处理网络异常,比如无网络连接、请求超时等 Log.e("API_ERROR", "网络请求异常:" + e.getMessage()); }
方法2:直接用JsonObject解析(无需实体类)
如果不想额外创建实体类,可以直接用Gson的JsonParser解析响应体:
try (Response response = okHttpClient.newCall(request).execute()) { if (response.isSuccessful()) { // 成功逻辑处理 } else { if (response.code() == 400) { String errorBody = response.body().string(); JsonObject errorJson = JsonParser.parseString(errorBody).getAsJsonObject(); String errorMessage = errorJson.get("Message").getAsString(); Log.d("API_ERROR", "捕获到错误消息:" + errorMessage); } } } catch (IOException e) { e.printStackTrace(); }
注意事项
- 响应体的
string()方法只能调用一次,调用后会关闭响应流,所以一定要先将其保存为字符串再进行解析。 - 必须处理
IOException,避免因网络问题导致应用崩溃。 - 可以根据业务需求扩展处理其他HTTP状态码,覆盖更多错误场景。
内容的提问来源于stack exchange,提问作者Ahmad Aghazadeh
相关产品推荐
相关产品推荐

