¿Cómo puedo hacer que cada punto final de descanso lea una cookie y use ese valor en okhttp Interceptor?

Tengo muchos puntos finales como:

Índice @GET ()

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

y agregando:

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

Puedo leer el valor en esa cookie muy bien.

Pero no quiero agregar esta @CookieParam("My-Cookie") cookie: String? línea a 100 de puntos finales. Quiero de alguna manera hacer que esto suceda para cada uno de manera pnetworkingeterminada y luego usar ese valor cuando realizo una llamada http a otra API usando okhttp retrofit.

Debería tener un interceptor para agregar cookies para usted. Interceptor es bastante flexible, puede tener un interceptor para las cookies recibidas y otro para configurar sus 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 } } 

No recomendaría rodar tu propio Cookie Interceptor como @natan Sugerido. OkHttp tiene una funcionalidad incorporada para los tarros de cookies que manejará mucho más que solo lo básico. Por ejemplo, si necesita expiraciones, basado en dominio, basado en ruta, ssl solo …

 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(); 

Esto debería manejar todas las cookies para usted agregando un module OkHttp adicional.

  • ¿Cómo puedo usar RetroFit2 responseBodyConverter en Kotlin?