2016-09-06 1 views
0

Gibt es eine bessere Art und Weise Träger wie eine globale Konfiguration zu setzen, anstatt sie jedes Mal, wie diese Einstellung:Bessere Möglichkeit, allgemeine Header und Root zu behandeln?

restClient.setBearerAuth(TokenStore.getInstance().getLocalToken());    

Die für Stamm-URL gleich, eine globale Konfiguration ist es, anstatt es wie diese Einstellung:

String root= Application.getInstance().getApplicationContext().getResources().getString(R.string.whiteLabelApiBaseHost) 
restClient.setRootUrl(root);    

In Nachrüstung gibt es so etwas wie dieses:

Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(Application.getInstance().getApplicationContext() 
          .getResources().getString(R.string.whiteLabelApiBaseHost)) 

Jede Idee?

Antwort

0

Um Root-URL setzen Sie diese Methode verwenden können, die Zeichenfolge mit einer konstanten

@Rest(rootUrl = "http://company.com/ajax/services", converters = { MappingJackson2HttpMessageConverter.class }, interceptors = MyAuthInterceptor.class) 
public interface MyRestClient { 
    @Get("/events") 
    EventList getEvents(); 
} 

Hinweis ersetzt, dass wir ein Abfangjäger in den Argumenten der @Rest Anmerkung gesetzt. So eine Klasse wie folgt erstellen:

@EBean(scope = Scope.Singleton) 
public class MyAuthInterceptor implements ClientHttpRequestInterceptor { 

@Bean 
MyAuthStore authStore; 

public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { 
    HttpHeaders headers = request.getHeaders(); 
    HttpAuthentication auth = new HttpBasicAuthentication(authStore.getUsername(), authStore.getPassword()); 
    headers.setAuthorization(auth); 
    return execution.execute(request, body); 
    } 
} 

Nun, bevor Anfrage MyAuthInterceptor.intercept Ausführung() aufgerufen wird und Sie Ihre Authentifizierungsdaten festlegen können, wie Sie

In Ihrem Haupt build.gradle Datei bevorzugen, können Sie hinzufügen innerhalb von android-Elemente

productFlavors { 

    development { 
     buildConfigField "String", "SERVICE_URL_BASE", "\"dev.xxx.com/rest\"" 
    } 

    test { 
     buildConfigField "String", "SERVICE_URL_BASE", "\"test.xxx.com/rest\"" 
    } 

    production { 
     buildConfigField "String", "SERVICE_URL_BASE", "\"production.xxx.com/rest\"" 
    } 
} 

Dann in Ihrer @Rest Anmerkung können Sie diesen Code verwenden, um aktuellen Geschmack Wert zu erhalten:

@Rest(rootUrl = "https://" + BuildConfig.SERVICE_URL_BASE) 

Jetzt können Sie auswählen, welche Build-Variante verwendet werden soll (variant = flavor + buildType), um den gewünschten Wert zu verwenden. Um die Variante auszuwählen, können Sie die entsprechende Ansicht verwenden, sie soll auf der linken Seite des Android-Studios anwesend sein.

Diese Technik ist nützlich zu vermeiden Geschmack des Paketbaum zu schaffen nur verschiedene variabiles verwenden

+0

Vielen Dank für Antwort, wie würde ich 'R.string.whiteLabelApiBaseHost' in' @ Rest' verwenden? Kann ich rootUrl innerhalb des Interceptors setzen? – simo

+0

Ich glaube nicht, dass Sie rootUrl im Interceptor setzen können, sicherlich nicht leicht. Warum brauchst du das? Vielleicht kannst du es auf andere Weise lösen. und warum müssen Sie rootUrl von String-Ressourcen abrufen? Wenn Sie verschiedene URLs basierend auf der Umgebung verwenden müssen, schlage ich vor, Variablen für die Erstellung von Variablen zu verwenden. – firegloves

+0

Können Sie ein Beispiel für die Verwendung der Gradle-Build-Variable schreiben, um RootUrl basierend auf der Umgebung auf "@Rest" zu setzen? – simo

Verwandte Themen