如何让每个 rest 端点读取一个 cookie 并在 okhttp 拦截器中使用该值?



>我有很多端点,例如:

@GET 索引((

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

以及通过添加:

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

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

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

你应该有一个拦截器来为你添加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
}
}

我不建议像@natan建议的那样滚动自己的cookie拦截器。OkHttp 内置了饼干罐的功能,可以处理的不仅仅是基础知识。例如,如果您需要过期、基于域、基于路径、仅 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。

相关内容

最新更新