您可以通过拦截器在Retrofit中添加Cookie,这是我们在API请求中动态管理Cookie的最佳解决方案。
我尝试过使用JavaNetCookieJar(cookieManager),但在我的情况下无法工作。因此,我使用了Interceptor,在依赖注入(Dagger和Koin)中也可以使用。
步骤1:创建ReceivedCookiesInterceptor类来接收Cookie。
Java代码:ReceivedCookiesInterceptor.java
public class ReceivedCookiesInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Response originalResponse = chain.proceed(chain.request());
if (!originalResponse.headers("Set-Cookie").isEmpty()) {
HashSet<String> cookies = new HashSet<>();
for (String header : originalResponse.headers("Set-Cookie")) {
cookies.add(header);
}
Preferences.getDefaultPreferences().edit()
.putStringSet(Preferences.PREF_COOKIES, cookies)
.apply();
}
return originalResponse;
}
}
Kotlin代码:ReceivedCookiesInterceptor.Kt
class ReceivedCookiesInterceptor : Interceptor {
@Throws(IOException::class)
override fun intercept(chain: Interceptor.Chain): Response {
val originalResponse: Response = chain.proceed(chain.request())
if (originalResponse.headers("Set-Cookie").isNotEmpty()) {
val cookies: HashSet<String> = HashSet()
for (header in originalResponse.headers("Set-Cookie")) {
cookies.add(header)
}
preferenceProvider.putStringSet("PREF_COOKIES", cookies)
}
return originalResponse
}
}
步骤2:创建AddCookiesInterceptor类以存储cookies。
Java代码:AddCookiesInterceptorclass.java
public class AddCookiesInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request.Builder builder = chain.request().newBuilder();
HashSet<String> preferences = (HashSet) Preferences.getDefaultPreferences().getStringSet(Preferences.PREF_COOKIES, new HashSet<>());
for (String cookie : preferences) {
builder.addHeader("Cookie", cookie);
Log.v("OkHttp", "Adding Header: " + cookie);
}
return chain.proceed(builder.build());
}
}
Kotlin代码:AddCookiesInterceptorclass.kt
class AddCookiesInterceptor : Interceptor {
@Throws(IOException::class)
override fun intercept(chain: Interceptor.Chain): Response {
val builder: Request.Builder = chain.request().newBuilder()
val prefCookies: HashSet<String> =
preferenceProvider.getStringSet("PREF_COOKIES", HashSet())
for (cookie in prefCookies) {
builder.addHeader("Cookie", cookie)
}
return chain.proceed(builder.build())
}
}
步骤3:将这些拦截器添加到您的okHttpClientObject中
Java代码:在Retrofit请求中添加拦截器
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.interceptors().add(new AddCookiesInterceptor());
okHttpClient.interceptors().add(new ReceivedCookiesInterceptor());
Kotlin代码:为Retrofit请求添加拦截器
val okHttpClient = OkHttpClient().newBuilder()
.connectionSpecs(specs)
.addInterceptor(requestInterceptor)
.addInterceptor(AddCookiesInterceptor())
.addInterceptor(ReceivedCookiesInterceptor())