CaptRisky CaptRisky - 3 months ago 108
Android Question

Retrofit 2 synchronous call error handling for 4xx Errors

I'm using a android-priority-jobqueue and I use retrofit to make synchronous calls to my rest api but i'm unsure how to handle errors like 401 Unauthorized errors which I send back json stating the error. Simple when doing async calls but I'm adapting my app for job manager. below is a simple try catch for IO exceptions, but 401's 422's etc? How to do this?

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
}


EDIT

The use of the retrofit response object was the clincher for me, returning the retrofit response object allowed me to

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);
}

Answer

Check response code and show the appropriate message.

Try this:

 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...