Я завернул свой код модернизации в класс, как показано ниже. Если из кода, который я публикую, неясно, он взаимодействует с успокоительной службой с помощью 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
}
...
}
});
}
}
Естественно, мне пришлось бы создать свой собственный интерфейс обратного вызова только с методом успеха.