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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:45:19