2014-02-19 3 views
0

Я использую 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.

Есть ли какие-либо опции, которые я перечислил, нормально? или есть лучшее решение для обработки случая невозможности создания интерфейса?

ответ

1

Я использую Дооснащение для подключения к пользовательской настраиваемой URL ...

Вы должны проверить и немедленно отказаться от пустой URL-адресов из их происхождения. Ваше приложение никогда не должно делать это достаточно далеко, чтобы построить RestAdapter с недопустимым URL.

Основная причина немедленного отказа - избежать маскировки проблем. Если есть плохие данные, их нужно всплывать, как только это видно, а не скрывать их за ложной реализацией интерфейса, который отклоняет вызовы API.