【问题标题】:How to get Retrofit success response status codes如何获取改造成功响应状态码
【发布时间】:2015-10-26 18:53:51
【问题描述】:

我无法从 200,201.. 等响应中获取成功响应状态代码。因为我们可以轻松地从 RetrofitError 类中获取错误代码,例如 error.isNetworkError() 和 error.getResponse().getStatus()。有什么办法可以获取状态码吗?

【问题讨论】:

    标签: android retrofit retrofit2


    【解决方案1】:

    根据 Retrofit 2.0.2,现在调用是

    @Override
    public void onResponse(Call<YourModel> call, Response<YourModel> response) {
        if (response.code() == 200) {
           // Do awesome stuff
        } else {
           // Handle other response codes
        }
    }
    

    希望它可以帮助某人:-)

    编辑:许多应用程序也可以受益于仅在一个子句中检查成功(响应代码 200-300),然后在其他子句中处理错误,如 201(已创建)和 202(已接受) ) 在大多数情况下可能会导致与 200 相同的应用逻辑。

    @Override
    public void onResponse(Call<YourModel> call, Response<YourModel> response) {
        if (response.isSuccessful()) {
           // Do awesome stuff
        } else if (response.code() == 401) {
           // Handle unauthorized
        } else {
           // Handle other responses
        }
    }
    

    【讨论】:

    • response.code == 401 应该是response.code() == 401。
    • 我应该覆盖哪个类?
    • 这个方法应该在哪个类写?
    • 有人可以回答@KaranSharma 的问题吗,我也很困惑...我的结构如下所示:Service -> DataSource -> Repository -> ViewModel -> Fragment
    【解决方案2】:

    您可以像在failure() 中一样在success() 中获取状态码

    @Override
    public void success(Object object, Response response) {
        response.getStatus() // returns status code integer
    }
    

    由于您在成功回调中有一个 Response 对象作为 response.getStatus()

    编辑

    我假设您使用 okhttp 和 retrofit。

    okhttp 有一个强大的工具叫做Interceptor

    您可以在改造回调之前捕获响应并从响应中获取状态码:

    OkHttpClient client = new OkHttpClient();
    client.interceptors().add(new  Interceptor(){
        @Override 
        public Response intercept(Chain chain) throws IOException{
    
        Request request = chain.request();
        Response response = chain.proceed(request);
        response.code()//status code
        return response;
    
    });
    
    // then add it to you Restclient like this:
    restAdapter = new RestAdapter.Builder()
                    .setEndpoint(URL_SERVER_ROOT)
                    .setClient(new OkClient(client))  //plus your configurations       
                    .build();
    

    要了解有关拦截器的更多信息,请访问here。

    【讨论】:

    • 我没有找到任何函数response.getStatus()。我用的是retrofit 1.9.0,你用的是哪个版本?
    • 我也在使用 1.9.0。你在使用回调接口吗?
    • 是的,但是根据 square.github.io/retrofit/javadoc/retrofit/Callback.html 文档,我们有两个回调成功和失败。根据定义,由于网络故障、非 2XX 状态代码或来自意外异常,我们将得到不成功的 HTTP 响应失败,但只有成功的 HTTP 响应来自成功。
    • 但我很确定成功回调有 2 个参数第一个是您的类型第二个是响应,如文档所述:成功(T t,响应响应)
    • 我已经通过减少版本来修复它以编译 'com.squareup.okhttp:okhttp:2.2.0' 并编译 'com.squareup.okhttp:okhttp-urlconnection:2.2.0' 。谢谢你的努力。
    【解决方案3】:

    我通过以下代码实现了它:

    public abstract class BaseCallBack<T> {
    
        public abstract void onSuccess(Response<T> response);
        public abstract void onFailure(Response<T> response);
    }
    
    public abstract class SuccessCallback<T> extends BaseCallBack<T> implements Callback<T>{
    
    
        @Override
        public void onResponse(Call<T> call, Response<T> response) {
    
            if(response.code()>= 400 && response.code() < 599){
                 onFailure(response);
            }
            else {
                onSuccess(response);
            }
    
        }
    
        @Override
        public void onFailure(Call<T> call, Throwable t){
    
        }
    
        @Override
        public void onSuccess(Response<T> response) {
    
        }
    
        @Override
        public void onFailure(Response<T> response) {
    
        }
    }
    

    当其余 api 返回 400 等时,默认调用 onFailure 方法。如果你想做一些 onsuccess:(当返回 200 等时)

     ServiceConnector.api.getHomePage().enqueue(new SuccessCallback<Void>() {
            @Override
            public void onSuccess(Response<Void> response) {
                super.onSuccess(response);
            }
        });
    

    【讨论】:

      【解决方案4】:

      您应该在 onError 响应中获得异常代码

      HttpException httpException =((HttpException) e).code();
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      • 2020-06-27
      • 1970-01-01
      相关资源
      最近更新 更多