2016-03-04 13 views
5

Próbujemy przejść do używania Retrofit2 i mam problem z wymaganiem, w którym musimy przekazać zestaw dynamicznie generowanych nagłówków (używanych do analiz) dla każdego żądanie.Jak dynamicznie ustawiać listę nagłówków w Retroficie 2 (Android)

@Headers nie jest obsługiwany na poziomie parametru, a ponieważ nazwa pola nagłówka zmienia się w zależności od bieżącej aktywności, nie mogę używać @Header.

Czy istnieje sposób dołączania nagłówków tuż przed wykonaniem()? (Szuka czegoś podobnego do @ QueryMap/@ FieldMap, ale dla nagłówków)

UWAGA: Nie mam listy nagłówków podczas inicjowania klienta (a tym samym nie można użyć Interceptora, aby to zrobić).

Odpowiedz

2

Nadal możesz (i musisz) używać Interceptora.
Wszystko czego potrzebujesz to mała architektura.

Najpierw utwórz pomocnika, który zapewni niezbędne nagłówki.

public class AnalyticsHeader { 
private String analyticsHeaderName; 
private String analyticsHeaderValue; 

public void setHeaderValue(String header) { 
    this.analyticsHeaderValue = header; 
} 

public void setHeaderName(String header) { 
    this.analyticsHeaderName = header; 
} 

public String getHeaderName() { 
    return analyticsHeaderName; 
} 
public String getHeaderValue() { 
    return analyticsHeaderValue; 
} 
} 

przechowywać instancję tej klasy w dostępnym miejscu wewnątrz aplikacji, na przykład główną działalność Nasze aplikacji (lub nawet lepiej użyć Dependency Injection)

Teraz, po utworzeniu Interceptor prostu przekazać instancja AnalyticsHeader do Interceptor:

public static final class AnalyticsInterceptor implements Interceptor { 
     private final AnalyticsHeader header; 

     public AnalyticsInterceptor(AnalyticsHeader header) { 
      this.header = header; 
     } 

     @Override 
     public Response intercept(Chain chain) throws IOException { 
      final Request original = chain.request(); 
      Response response; 
      if (header.getHeader() != null) { 
       Request request = original.newBuilder() 
         .header(header.getHeaderName(), header.getHeaderValue()) 
         .method(original.method(), original.body()) 
         .build(); 
       response = chain.proceed(request); 
      } else { 
       response = chain.proceed(original); 
      } 

     return response; 
     } 
} 

a potem ...

OkHttpClient.Builder builder = new OkHttpClient.Builder(); 
builder.addInterceptor(new AnalyticsInterceptor(CentralPlaceInApp.getAnalyticsHeader()); 
... 
retrofit = new Retrofit.Builder() 
       .baseUrl(config.getRestUrl()) 
       .client(builder.build()) 
       .build(); 

Teraz możesz zmienić wartość nagłówka w dowolnym momencie podczas uruchamiania aplikacji, korzystając z CentralPlaceInApp.getAnalyticsHeader().setHeaderValue(CurrentActivity.class.getSimpleName());

Powiązane problemy