2017-08-01 2 views
0

J'ai beaucoup de points d'extrémité comme:Comment puis-je faire en sorte que chaque point de terminaison lit un cookie et utilise cette valeur dans okhttp Interceptor?

@GET index ()

de @GET @Path ("/ {id}")

et en ajoutant:

@GET 
    @Path("/{id}") 
    fun getThing(@CookieParam("My-Cookie") cookie: String?) 

Je peux lire la valeur dans ce cookie très bien.

Mais je ne veux pas ajouter cette ligne @CookieParam("My-Cookie") cookie: String? à 100 de points de terminaison. Je veux en quelque sorte faire cela pour chacun par défaut, puis utiliser cette valeur lorsque je fais un appel http à une autre API en utilisant okhttp retrofit.

+1

vous devez écrire un [interceptor/adapter] (https://github.com/square/retrofit/tree/master/retrofit-adapters) pour la mise à niveau pour configurer le cookie automatiquement. –

+0

tous les exemples que je vois pour cela ne me donnent pas accès à ces mêmes cookies que j'ai de @CookieParam ("My-Cookie"). Avez-vous un lien? –

Répondre

1

Vous devriez avoir un intercepteur pour ajouter des cookies pour vous. Interceptor est assez flexible, vous pouvez avoir un intercepteur pour les cookies reçus et un autre pour configurer vos cookies.

var cookie: String? = null 

fun createOwnClient(): MyOwnClient { 
    val client = createOkHttpClient() 
    val retrofit = Retrofit.Builder().baseUrl(MyOwnConstants.API_BASE_URL) 
      .client(client) 
      .build() 
    return retrofit.create(MyOwnClient::class.java) 
} 

fun createOkHttpClient(): OkHttpClient { 
    val addCookiesInterceptor = createAddCookiesInterceptor() 
    val receivedCookiesInterceptor = createReceivedCookiesInterceptor() 
    return OkHttpClient.Builder() 
      .addInterceptor(addCookiesInterceptor) 
      .addInterceptor(receivedCookiesInterceptor) 
      .build() 
} 

fun createAddCookiesInterceptor(): Interceptor { 
    return Interceptor { 
     val requestBuilder = it.request().newBuilder() 
     if (cookie != null) { 
      requestBuilder.addHeader("Cookie", cookie) 
     } 
     it.proceed(requestBuilder.build()) 
    } 
} 

fun createReceivedCookiesInterceptor(): Interceptor { 
    return Interceptor { 
     val originalRequest = it.proceed(it.request()) 
     cookie = originalRequest.header("Set-Cookie") 
     originalRequest 
    } 
} 
0

Je ne recommanderais pas de rouler votre propre Interceptor Cookie comme @natan suggéré. OkHttp a intégré des fonctionnalités pour les boîtes à cookies qui géreront beaucoup plus que les bases. Par exemple, si vous avez besoin expirations, domaine basé, chemin basé, ssl seulement ...

import okhttp3.JavaNetCookieJar; 

CookieManager cookieManager = new CookieManager(); 
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); 
JavaNetCookieJar cookieJar = new JavaNetCookieJar(cookieManager); 

OkHttpClient client = new OkHttpClient.Builder().cookieJar(cookieJar).build(); 

Cela devrait gérer tous les cookies pour vous en ajoutant un module supplémentaire OkHttp.