Увих кода си за модернизация в клас като по-долу. Ако не е ясно от кода, който публикувам, той взаимодейства със спокойна услуга с OAuth.
Какъв би бил добър начин за обработка на грешки? REST сървърът връща съобщение за грешка във формат json. Бих искал да действам спрямо това съобщение, като хвърлям някои изключения от моя клас. Опитвам се да направя нещо като по-долу. Но това добър дизайн ли е? Смесването на обратни извиквания и хвърляне на изключения добра идея ли е? Има ли по-добър начин?
С подхода по-долу бих могъл да получа i18l съобщения от моите персонализирани изключения и да ги изпича на потребителя.
public class RestClient implements IRestClient {
private IRestAPI api;
/**
*
* @param accessToken
*/
public RestClient(final String accessToken)
{
RequestInterceptor requestInterceptor = new RequestInterceptor()
{
@Override
public void intercept(RequestFacade request) {
request.addHeader("Authorization", "Bearer " + accessToken);
}
};
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(Config.ENDPOINT)
.setRequestInterceptor(requestInterceptor)
.build();
api = restAdapter.create(IRestAPI.class);
}
@Override
public void requestSomething(final Callback callback) {
api.getSomething(new Callback<Something>() {
@Override
public void success(Something something, Response response) {
callback.success(something, response);
}
@Override
public void failure(RetrofitError error) {
if(error.getMessage().getId().euqals(ACCESS_TOKEN_EXPIRED))
{
throw new AccessTokenExpired();
}
else if(error.getMessage().getId().euqals(USER_NOT_FOUND))
{
throw new UsernamePasswordNotFound();
}
else // something else happened...
{
throw error;
}
}
});
}
@Override
public void deleteSomething(final Callback callback) {
api.deleteSomething(new Callback<Something>() {
@Override
public void success(Something something, Response response) {
callback.success(something, response);
}
@Override
public void failure(RetrofitError error) {
if(error.getMessage().getId().euqals(SOMETHING_NOT_FOUND))
{
...
...
Different exceptions
}
...
}
});
}
}
Естествено ще трябва да създам свой собствен интерфейс за обратно повикване само с метод за успех.