我有很多端点,如:
@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调用时使用该值。
答案 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。