Mein Retrofit 2 (2.0.2
derzeit) Client muss benutzerdefinierte Header zu Anforderungen hinzufügen.Retrofit 2 - Elegante Möglichkeit zum Hinzufügen von Kopfzeilen in der API-Ebene
Ich verwende eine Interceptor
diese Header auf alle Anfragen hinzuzufügen:
OkHttpClient httpClient = new OkHttpClient();
httpClient.networkInterceptors().add(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
final Request request = chain.request().newBuilder()
.addHeader("CUSTOM_HEADER_NAME_1", "CUSTOM_HEADER_VALUE_1")
.addHeader("CUSTOM_HEADER_NAME_2", "CUSTOM_HEADER_VALUE_2")
...
.addHeader("CUSTOM_HEADER_NAME_N", "CUSTOM_HEADER_VALUE_N")
.build();
return chain.proceed(request);
}
});
Retrofit retrofitClient = new Retrofit.Builder()
.baseUrl(baseUrl)
.client(httpClient)
.build();
Einige Header Ich will immer hinzufügen, aber einige Header ich nur basierend auf den Anforderungen dieses spezifischen Endpunkt hinzufügen müssen, für Beispiel, ob der Benutzer authentifiziert werden muss oder nicht.
Ich möchte in der Lage sein, dass zum Beispiel auf API-Ebene zu steuern, eine Anmerkung mit, so etwas wie:
public interface MyApi {
@NO_AUTH
@POST("register")
Call<RegisterResponse> register(@Body RegisterRequest data);
@GET("user/{userId}")
Call<GetUserResponse> getUser(@Path("userId") String userId);
}
Wenn eine Anfrage an register
dort sendet keine Notwendigkeit, die Authentifizierungs-Token hinzufügen , aber Anfragen, denen die @NO_AUTH
Annotation fehlt, haben den Token-Header.
Von dem, was ich verstehe Retrofit 2 unterstützt benutzerdefinierte Anmerkungen nicht, und während ich diese Problemumgehung für Custom Annotations with Retrofit 2 fand, scheint es ein bisschen zu viel.
Ich möchte die Notwendigkeit zu vermeiden, diese Header pro Anforderung übergeben, wie:
public interface MyApi {
@POST("register")
Call<RegisterResponse> register(@Body RegisterRequest data);
@GET("user/{userId}")
Call<GetUserResponse> getUser(@Header("AuthToken") String token, @Path("userId") String userId);
}
Es fühlt sich einfach überflüssig, es zu tun, jedesmal wenn ich die Methode aufrufen, anstatt sie in die Abfangjäger tun (da Ich habe Zugriff auf die Header-Werte statisch).
Ich muss nur irgendwie in meiner Interceptor.intercept
Implementierung wissen, ob diese spezifische Anfrage einen bestimmten Header haben sollte oder nicht.
Irgendeine Idee, wie ich das schaffen kann?
Ich bevorzuge eine generische Lösung und nicht nur für den Auth-Token-Fall, aber eine spezifische Lösung ist auch willkommen. Danke
Bedeutet das, dass Sie für jede Anfrage einen neuen '' 'OKHttpClient''' verwenden? –
@panduka Nein. Das war nur für das Beispiel, Sie können einen Client haben. –
Dies ist die sauberste Lösung tatsächlich, danke für die Weitergabe :) – MatPag