Я использую Retrofit для подключения к настраиваемому пользователю URL, проблема, с которой я сталкиваюсь, заключается в том, как обрабатывать пустой URL-адрес. Как и ожидалось, RestAdapter.Builder генерирует исключение IllegalArgumentException, когда сервер имеет значение null/blank, а это означает, что невозможно вызвать create для создания модифицированного интерфейса, оставив мне нулевой интерфейс.Как справиться с переоснащением RestAdapter.Builder() Исключения?
Например, используя следующий интерфейс API;
interface IApiService {
@POST("/{path}/api/{userid}/calls/Action")
void startCall(@Path("path") String path, @Path("userid") String userid, @Body Action action, Callback<Response> callback);
@PUT("/{path}/api/{userid}/calls/Action")
void addToCall(@Path("path") String path, @Path("userid") String userid, @Body Action action, Callback<Response> callback);
}
Я создал класс-оболочку для интерфейса Retrofit как тип обратного вызова является дооснащения Обратный звонок, и я хочу, чтобы иметь возможность поменять это, если это необходимо.
public class ApiServiceWrapper implements IAPiServiceWrapper {
private IApiService mAPiService;
@Inject
ApiServiceWrapper(Settings settings, RequestInterceptor requestInterceptor) {
RestAdapter restAdapter = new RestAdapter.Builder()
.setServer(settings.getUrl())
.setRequestInterceptor(requestInterceptor)
.setConverter(new ActionConverter())
.build();
mAPiService = restAdapter.create(IApiService.class);
}
public void startCall(String path, String userid, Action action, final IApiResultCallback<Response> callback) {
mAPiService.startCall(path, userid, action, new Callback<Response>() {
@Override
public void success(Response response, Response response2) {
callback.success();
}
@Override
public void failure(RetrofitError error) {
callback.failure(error.getResponse().getReason());
}
});
}
public void addToCall(String path, String userid, Action action, final IApiResultCallback<Response> callback) {
mAPiService.addToCall(path, userid, action, new Callback<Response>() {
@Override
public void success(Response response, Response response2) {
callback.success();
}
@Override
public void failure(RetrofitError error) {
callback.failure(error.getResponse().getReason());
}
});
}
}
Как я должен обрабатывать Исключение, созданное RestAdapter.Builder?
В моих глазах кажется разумным проверить, возвращает ли settings.getUrl() действительный URL-адрес, если он заполняет интерфейс с помощью Retrofit. Но как я могу обработать случай, когда URL-адрес пуст, одно решение - проверить значение null, например;
public void startCall(String path, String userid, Action action, final IApiResultCallback<Response> callback) {
if (mAPiService != null) {
mAPiService.startCall(path, userid, action, new Callback<Response>() {
@Override
public void success(Response response, Response response2) {
callback.success();
}
@Override
public void failure(RetrofitError error) {
callback.failure(error.getResponse().getReason());
}
});
} else {
callback.failure("Some reason here :D");
}
}
Это работает, но мои интерфейсы API довольно большие, и я бы предпочел не проверять значение null при каждом вызове.
Что было бы неплохо, если бы я мог установить mAPiService на недопустимую реализацию, которая мгновенно просто вызывает отказ с сообщением, например;
@Inject
ApiServiceWrapper(Settings settings, RequestInterceptor requestInterceptor) {
if (TextUtils.isEmpty(settings.getUrl())) {
mAPiService = new InvalidSettingsApiService("some error")
} else {
RestAdapter restAdapter = new RestAdapter.Builder()
.setServer(settings.getUrl())
.setRequestInterceptor(requestInterceptor)
.setConverter(new ActionConverter())
.build();
mAPiService = restAdapter.create(IApiService.class);
}
}
Но это невозможно, так как интерфейс IApiService использует интерфейс дооснащения Callback, который требует параметр отказа от RetrofitError.
Есть ли какие-либо опции, которые я перечислил, нормально? или есть лучшее решение для обработки случая невозможности создания интерфейса?