【问题标题】:Retrofit - Different Response改造 - 不同的响应
【发布时间】:2016-10-06 09:45:46
【问题描述】:

我正在使用 Retrofit 在 Android 中使用 API。成功响应看起来与错误/失败响应不同。因此,我怎样才能做到这一点?

我目前对此有一些影响:

Call<AuthenticateUserResponse> authenticateUser(String id);

【问题讨论】:

    标签: android retrofit


    【解决方案1】:

    您可以使用基本响应扩展您的响应,并检查是否有错误或成功。下面是一个基本响应 bean 示例:

    public class BaseResponse {
        @SerializedName("ResponseCode")
        private int code;
        @SerializedName("ResponseMessage")
        private String message;
        @SerializedName("ResponseText")
        private String text;
    }
    

    我的 api 在每个响应者中返回 ResponseCodeResponseMessageResponseText,我从 BaseResponse bean 扩展我的响应并检查是否有错误。

    您可以将您的响应修改为您的 api 的返回方案。

    编辑:这是您对 Api 的回复:

    public class Error {
            @SerializedName("ResponseCode")
            private int code;
            @SerializedName("ResponseMessage")
            private String message;
            @SerializedName("ResponseText")
            private String text;
        }
    
    public class YourWrapperResponse {
            @SerializedName("Error")
            private Error error;
            @SerializedName("AuthenticateUserResponse")
            private AuthenticateUserResponse authenticateUserResponse;
        }
    

    你的电话会是这样的:

    Call<YourWrapperResponse> authenticateUser(String id);
    

    上面我给你的例子是一个处理业务错误的例子,你在每次成功的响应中都会遇到。 成功意味着 Http Status 200。 此外,您无需在每次回复中都返回此 Error object如果有错误您可以在回复中返回。

    在 Retrofit 2.0+ 中,您需要检查您的请求是否成功。下面是一个关于它的例子:

        Call<User> auth = YourApiProvider.getInstance().getServices().auth(userName, passowrd, grantType);
                auth.enqueue(new Callback<User>() {
                    @Override
                    public void onResponse(Call<User> call, Response<User> response) {
                        if (response.isSuccessful()) {
                            // Here you get a 200 from your server.
                            }
                        } else {
                            // Here you get an authentication error.
                            // You can get error with response.code();
                            // You can get your error with response.errorBody(); 
                            // or you can get raw response with response.raw()
                        }
                    }
    
                    @Override
                    public void onFailure(Call<User> call, Throwable t) {
                        // Here you get error such as TimeOut etc.
                    }
                });
    

    我希望这会对你有所帮助。祝你好运!

    编辑:您还可以使用泛型来处理基本 api 响应。这是我的另一个 answer 处理通用 api 响应。

    【讨论】:

    • 我使用的 API 在失败时返回一个 Error 对象,而在成功时不显示一个对象。您的子类化方法仍然有效吗?还是会在成功时抛出错误,说没有Error 这样的对象?
    • 当它成功时,它会映射你的对象。如果没有错误,它就不会说没有像错误这样的对象。所以我认为如果你把你的错误对象放在它的基础响应上,你不会遇到任何麻烦。
    • 如果请求失败,即 401,Retrofit 似乎没有序列化。如果请求成功,它会序列化。我错过了一些配置吗?
    • 没有。在 Retrofit 1.9 中,当你得到一个 http 错误时,你会得到一个 RetrofitError。在 2.0 中,您需要检查是否调用 response.isSuccessful()。我上面的示例是当您从服务器获得 200 并且您的 json 响应中出现业务错误时。
    • 我正在使用 Retrofit 2.0.2 和 OkHttp3.3.1。每当我调用 API 时,如果我得到 401(这是正确的,因为我还没有经过身份验证),response.body 总是为空......我需要 Error 对象(在 response.body 中)执行正确的操作。我该如何解决这个问题?
    猜你喜欢
    • 2020-09-15
    • 2018-07-10
    • 1970-01-01
    • 2019-03-14
    • 2018-05-16
    • 1970-01-01
    • 2021-12-21
    • 2018-12-16
    • 1970-01-01
    相关资源
    最近更新 更多