2016-06-16 5 views
0

Ich versuche, Singleton-Instanz für Retrofit2 zu erstellen, die gut funktioniert. Aber sobald ich zum dynamischen Header möchte, kann ich das nicht tun.Retrofit2 Singleton Instanz

Und in der anderen Tätigkeit kann ich Ruf zum Nachrüsten bekommen als.

ApiManager apiManager = ApiManager.getInstance(); apiManager.getService(). CheckExistsTeamName ("Parameter")

Was funktioniert hier gut Aber wollen, wenn ich zusätzliche zusätzliche dynamische Header hinzufügen möchte, wie soll ich es tun ?? Ich stecke hier fest

+0

Was meinen Sie mit zusätzlichen dynamischen Headern? Möchten Sie diese im Code 'original.newBuilder()' hinzufügen? – ishmaelMakitla

+0

Meinen Sie, indem Sie einem bestimmten API-Aufruf zusätzliche Header hinzufügen? – Emma

+0

Ja, ich meine, zusätzliche Header zu bestimmten APi Call @Emm – Sutirth

Antwort

1

Sie brauchen eine Art Abhängigkeitsinjektion. Probieren Sie diesen Code aus. Bevor Sie Ihren Service anrufen, rufen Sie

ApiManager.setHeaders(map of headers); 

mit Header-Werten. Ruf mit leerer Karte oder null an, um sie auszuschließen.

public class ApiManager { 


public final static String BASE_URL = "URL"; 



private static ApiManager instance =null; 
private ApiModule apiModule; 

public interface ApiModule { 


    @GET("exists") 
    Call<ServerStatus> checkExistsTeamName(@Path("teamName") String teamName); 


} 

private static Map<String, String> headers = new HashMap<>(); 

public static void setHeaders(Map<String, String> headers) { 
    ApiManager.headers = headers; 
} 

private ApiManager(){ 
    final TimeZone tz = TimeZone.getDefault(); 
    OkHttpClient client = new OkHttpClient(); 
    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(); 
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); 
    try { 
     client.interceptors().add(new Interceptor() { 
      @Override 
      public Response intercept(Interceptor.Chain chain) throws 
        IOException { 

       Request original = chain.request(); 
       Request.Builder builder = original.newBuilder() 
         .header("X-API-Version", "1") 
         .header("X-USER-TIMEZONE", tz.getID()) 
         .method(original.method(), original.body()); 

       if(headers != null) { 
        for (Map.Entry<String, String> entry : headers.entrySet()) { 
         builder.header(entry.getKey(), entry.getValue()); 
        } 
       } 

       Request request = builder.build(); 

       return chain.proceed(request); 

      } 
     }); 
    }catch (Exception e){ 

    } 
    client.interceptors().add(interceptor); 

    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(BASE_URL) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .client(client) 
      .build(); 

    apiModule = retrofit.create(ApiModule.class); 
} 





public static ApiManager getInstance() { 
    if(instance == null) { 
     instance = new ApiManager(); 
    } 
    return instance; 
} 




public ApiModule getService() { 
    return apiModule; 
} 

public ApiModule getService(String token){ 
    return apiModule; 
} 

}

+0

aber sollte ich irgendwelche Header-Funktionalität haben @svatOpluk? – Sutirth

+0

Ich habe versucht, aber es funktioniert nicht für mich und die Anwendung stürzt ab – Sutirth

0

Gemäß der Nachrüstung documentation wenn Sie Header auf spezifische Anfragen hinzufügen möchten, können Sie dies wie unten tun.

Sie können statische Header für eine Methode mit der Annotation @Headers festlegen.

@Headers("Cache-Control: max-age=640000") 
@GET("widget/list") 
Call<List<Widget>> widgetList(); 

@Headers({ 
    "Accept: application/vnd.github.v3.full+json", 
    "User-Agent: Retrofit-Sample-App" 
}) 
@GET("users/{username}") 
Call<User> getUser(@Path("username") String username); 

Beachten Sie, dass sich die Überschriften nicht gegenseitig überschreiben. Alle Header mit dem gleichen Namen werden in der Anfrage enthalten sein.

Ein Anforderungsheader kann dynamisch mit der @Header Annotation aktualisiert werden. Ein entsprechender Parameter muss dem @Header zur Verfügung gestellt werden. Wenn der Wert null ist, wird der Header weggelassen. Andernfalls wird toString für den Wert aufgerufen und das Ergebnis verwendet.

@GET("user") 
Call<User> getUser(@Header("Authorization") String authorization) 

Headers, die angegeben werden können, um jede Anfrage hinzugefügt werden müssen, ein OkHttp interceptor verwenden.

+1

FYI, ab 2.1.0 HeaderMap Annotation wird hinzugefügt, wenn wir mehrere dynamische Header-Parameter haben. https://github.com/square/retrofit/blob/master/CHANGELOG.md#version-210-2016-06-15 – Emma

+1

@ Jickson, @ Emma Dies löst nicht den Zweck Ich muss Header in jeder Anfrage schreiben Das ist mühsam und ich denke, nicht der richtige Weg zu tun – Sutirth

+0

Sie sollten OkHttp Interceptor verwenden, wenn Sie die gleichen Header für mehrere Anfragen verwenden möchten. Verweise diese https://futurestud.io/blog/retrofit-add-custom-request-header – Jickson