如何让每个休息端点读取cookie并在okhttp Interceptor中使用该值?

时间:2017-08-01 16:48:04

标签: rest kotlin retrofit dropwizard okhttp

我有很多端点,如:

@GET   指数()

@GET   @Path(" / {ID}&#34)

并添加:

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

我可以很好地读取该cookie中的值。

但我不想将此@CookieParam("My-Cookie") cookie: String?行添加到100个端点。我希望以某种方式默认情况下为每一个发生这种情况,然后在使用okhttp改造对另一个API进行http调用时使用该值。

2 个答案:

答案 0 :(得分:1)

你应该有一个拦截器来为你添加cookie。拦截器非常灵活,您可以使用拦截器接收cookie,另一个拦截器设置您的cookie。

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
    }
}

答案 1 :(得分:0)

我不建议像@natan一样推出自己的Cookie拦截器。 OkHttp内置了用于cookie jar的功能,它不仅仅处理基础知识。例如,如果您需要过期,基于域,基于路径,仅限ssl ......

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

这应该通过添加一个额外的OkHttp模块来处理所有cookie。