My Retrofit 2 (2.0.2
attualmente) il client deve aggiungere intestazioni personalizzate alle richieste.Retrofit 2: un modo elegante per aggiungere intestazioni a livello di API
sto usando un Interceptor
per aggiungere queste intestazioni a tutte le richieste:
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();
Alcune intestazioni ho sempre voglia di aggiungere, ma alcune intestazioni Ho solo bisogno di aggiungere in base ai requisiti di quello specifico endpoint, per esempio se l'utente deve essere autenticato o meno.
Mi piacerebbe avere la possibilità di controllare che a livello di API, ad esempio utilizzando un'annotazione, qualcosa di simile:
public interface MyApi {
@NO_AUTH
@POST("register")
Call<RegisterResponse> register(@Body RegisterRequest data);
@GET("user/{userId}")
Call<GetUserResponse> getUser(@Path("userId") String userId);
}
Quando si invia una richiesta di register
non c'è bisogno di aggiungere il token di autenticazione , ma richiede a chi manca l'annotazione @NO_AUTH
l'intestazione del token.
Da quello che ho capito Retrofit 2 non supporta annotazioni personalizzate e mentre ho trovato questa soluzione alternativa per Custom Annotations with Retrofit 2, sembra un po 'troppo.
vorrei evitare la necessità di superare queste intestazioni per ogni richiesta, come:
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);
}
Si sente solo ridondante di farlo ogni volta che chiamo il metodo invece di farlo nel intercettore (dal Ho accesso ai valori di intestazione staticamente).
Ho solo in qualche modo bisogno di sapere nella mia implementazione Interceptor.intercept
se questa specifica richiesta dovrebbe avere o meno una (e) intestazione specifica.
Qualche idea su come posso farlo funzionare?
Preferisco una soluzione generica e non solo per il caso del token auth, ma è anche benvenuta una soluzione specifica. Grazie
Significa che stai usando il nuovo '' 'OkHttpClient''' per ogni richiesta? –
@panduka No. Questo era solo per l'esempio, puoi avere un cliente. –
Questa è la soluzione più pulita in realtà, grazie per la condivisione :) – MatPag