android - 如何使用 Retrofit 2 获得错误主体响应

标签 android retrofit retrofit2

我正在使用 Retrofit 2,我需要处理 JSON 格式的响应错误。以下是响应正文的示例。

{
    "success": false,
    "error": {
        "message": {
            "name": [
                "This input is required."
            ]
        }
    }
}
message包含有错误的字段列表,这意味着该值是动态的。因此,一种可能的解决方案是将响应正文解析为 JSON 对象。我尝试使用 response.errorBody().string() 获取错误正文
@Override
public void onResponse(final Call<Category> call, final Response<Category> response) {
    if (response.isSuccessful()) {

    } else {
        // Handle error
        String errorBody = response.errorBody().string();
    }
}

不幸的是,打印 errorBody我只能得到以下结果{"success":false,"error":{"message":{"name":[""]}}}Retrofit 是否限制了 errorBody 对象的深度?我应该怎么做才能获得可以解析的完整响应体?

最佳答案

试试我在改造中使用的这个 fragment 。并获取动态错误消息解决方案

@Override
public void onResponse(final Call<Category> call, final Response<Category> response) {
    if (response.isSuccessful()) {

    } else {
        try {
            String errorBody = response.errorBody().string();

            JSONObject jsonObject = new JSONObject(errorBody.trim());

            jsonObject = jsonObject.getJSONObject("error");

            jsonObject = jsonObject.getJSONObject("message");

            Iterator<String> keys = jsonObject.keys();
            String errors = "";
            while (keys.hasNext()) {
                String key = keys.next();
                JSONArray arr = jsonObject.getJSONArray(key);
                for (int i = 0; i < arr.length(); i++) {
                    errors += key + " : " + arr.getString(i) + "\n";
                }
            }
            Common.errorLog("ERRORXV", errors);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

关于android - 如何使用 Retrofit 2 获得错误主体响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52708582/

相关文章:

android - 在 Flash Builder 4.5 中,有没有办法知道我在编译时将项目构建到哪个平台(android 或 iOs)?

android - 如何在android中自定义链接文本

android - Kotlin Coroutines viewModelScope 中的改造调用

java - 如何结合地点附近 api 和地点详细信息 api?改造java rx

java - Retrofit2不发送POST数据

java - 不幸的是,<project name> 已停止

android - Android Gradle在编译时识别当前的错误

java - 尝试拦截 Retrofit 请求时出现未经授权的错误

java - 必须有返回类型或回调作为最后一个参数 Retrofit2 Android?

java - Retrofit中如何迭代键值对