对4xx错误进行2次同步调用错误处理

时间:2016-09-06 15:01:49

标签: android error-handling retrofit2 synchronous

我正在使用android-priority-jobqueue并且我使用改造来对我的rest api进行同步调用但是我不确定如何处理像401 Unauthorized错误的错误,我发回json说错误。在进行异步调用时很简单,但我正在调整我的应用程序作为职位经理。下面是一个简单的尝试捕获IO异常,但401的422等?怎么做?

try {
    PostService postService = ServiceGenerator.createService(PostService.class);
    final Call<Post> call = postService.addPost(post);
    Post newPost = call.execute().body();

    // omitted code here

} catch (IOException e) {
    // handle error
}

修改

使用改装响应对象对我来说是个难题,返回改装响应对象让我

Response<Post> response = call.execute();

if (response.isSuccessful()) {
    // request successful (status code 200, 201)
    Post result = response.body();

    // publish the post added event
    EventBus.getDefault().post(new PostAddedEvent(result));
} else {
    // request not successful (like 400,401,403 etc and 5xx)
    renderApiError(response);
}

2 个答案:

答案 0 :(得分:6)

检查回复代码并显示相应的消息。

试试这个:

 PostService postService = ServiceGenerator.createService(PostService.class);
 final Call<Post> call = postService.addPost(post);

Response<Post> newPostResponse = call.execute();

// Here call newPostResponse.code() to get response code
int statusCode = newPostResponse.code();
if(statusCode == 200)
    Post newPost = newPostResponse.body();
else if(statusCode == 401)
    // Do some thing... 

答案 1 :(得分:0)

在每个响应中放入401检查不是一个很好的方法。取而代之的是,可以在基本级别上应用此检查,即在通过拦截器创建用于改造的对象时。看看:

public synchronized static Retrofit getClientWithRetry(final Context ctx) {
    if (clientWithRetry == null) {
        Interceptor responseCodeInterceptor = new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Request request = chain.request();
                Response response = chain.proceed(request);
                if (response.code() == 401) {
                    Log.d(LOG_TAG, "Intercepted Req: " + response.toString());
                    Response r = retryWithFreshToken(request, chain);
                    return r;
                }
                return response;
            }
        };

        int cacheSize = 10 * 1024 * 1024; // 10 MB
        Cache cache = new Cache(ctx.getCacheDir(), cacheSize);

        HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
        logging.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(logging)
                .addInterceptor(responseCodeInterceptor)
                .cache(cache)
                .build();

        Retrofit.Builder builder = new Retrofit.Builder()
                .baseUrl(API_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .client(client);
        clientWithRetry = builder.build();
    }
    return clientWithRetry;
}

如果在内部观察到401,则可以发出新的链接请求,并且可以提取令牌。可以完成原始请求的帖子。取自此Retrofit retry tutorial