Moje Retrofit 2 (obecnie 2.0.2
) klient musi dodać niestandardowe nagłówki do żądań.Retrofit 2 - Elegancki sposób dodawania nagłówków na poziomie api
Używam Interceptor
dodać te nagłówki do wszystkich żądań:
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();
Niektóre nagłówki zawsze chcę dodać, ale niektóre nagłówki tylko trzeba dodać na podstawie wymagań zawartych w tym konkretnym punkcie końcowym, na przykład, czy użytkownik musi być uwierzytelniony, czy nie.
Chciałbym mieć możliwość kontrolowania, że na poziomie API, na przykład za pomocą adnotacji, coś jak:
public interface MyApi {
@NO_AUTH
@POST("register")
Call<RegisterResponse> register(@Body RegisterRequest data);
@GET("user/{userId}")
Call<GetUserResponse> getUser(@Path("userId") String userId);
}
Wysyłając prośbę o register
nie ma potrzeby, aby dodać token uwierzytelniający , ale żądania, którym brakuje adnotacji @NO_AUTH
, będą miały nagłówek tokenu.
Z tego co rozumiem, Retrofit 2 nie obsługuje adnotacji niestandardowych i chociaż znalazłem to obejście dla Custom Annotations with Retrofit 2, wydaje się, że jest za dużo.
chciałbym uniknąć konieczności przechodzenia tych nagłówków na żądanie, takich jak:
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);
}
To po prostu czuje się zbędny robić to za każdym razem gdy wywołujemy metodę zamiast robić to w przechwytujących (od Mam statyczny dostęp do wartości nagłówka).
Po prostu muszę wiedzieć w mojej implementacji Interceptor.intercept
, czy to konkretne żądanie powinno mieć określony nagłówek (y).
Masz pomysł, jak to zrobić?
Preferuję rozwiązanie ogólne, a nie tylko w przypadku tokena uwierzytelniającego, ale konkretne rozwiązanie również jest mile widziane. Dzięki
Czy to oznacza, że używasz nowego '' 'OkHttpClient''' dla każdego żądania? –
@panduka No. To było tylko dla przykładu, możesz mieć jednego klienta. –
To jest najczystsze rozwiązanie, dzięki za udostępnienie :) – MatPag