Automatyczna obsługa plików cookie za pomocą OkHttp 3
Używam okhttp 3.0.1.
Każdy, gdzie dostaję przykład obsługi plików cookie, który jest z okhttp2
OkHttpClient client = new OkHttpClient();
CookieManager cookieManager = new CookieManager();
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
client.setCookieHandler(cookieManager);
Czy ktoś może mi pomóc, jak korzystać z wersji 3. metoda setCookieHandler nie występuje w wersji 3.
11 answers
Teraz się tym bawię. spróbuj PersistentCookieStore , Dodaj zależności gradle dla JavaNetCookieJar :
compile "com.squareup.okhttp3:okhttp-urlconnection:3.0.0-RC1"
I init
// init cookie manager
CookieHandler cookieHandler = new CookieManager(
new PersistentCookieStore(ctx), CookiePolicy.ACCEPT_ALL);
// init okhttp 3 logger
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
// init OkHttpClient
OkHttpClient httpClient = new OkHttpClient.Builder()
.cookieJar(new JavaNetCookieJar(cookieHandler))
.addInterceptor(logging)
.build();
`
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-19 21:10:02
Jeśli chcesz użyć nowego Okhttp 3 CookieJar i pozbyć się zależności okhttp-urlconnection
możesz użyć tego PersistentCookieJar .
Wystarczy utworzyć instancję PersistentCookieJar
, a następnie przekazać ją do konstruktora OkHttp
:
CookieJar cookieJar =
new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(context));
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.cookieJar(cookieJar)
.build();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-11 18:02:34
Tutaj masz proste podejście do tworzenia własnych CookieJar. Może być przedłużony, jak chcesz. Co zrobiłem, to zaimplementować CookieJar i zbudować OkHttpClient przy użyciu OkHttpClient./ Align = "left" /
public class MyCookieJar implements CookieJar {
private List<Cookie> cookies;
@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
this.cookies = cookies;
}
@Override
public List<Cookie> loadForRequest(HttpUrl url) {
if (cookies != null)
return cookies;
return new ArrayList<Cookie>();
}
}
Oto jak można utworzyć OkHttpClient
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.cookieJar(new MyCookieJar());
OkHttpClient client = builder.build();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-19 18:59:20
Dodawanie compile "com.squareup.okhttp3:okhttp-urlconnection:3.8.1"
do Twojej kompilacji.gradle.
A następnie dodanie
CookieManager cookieManager = new CookieManager();
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
OkHttpClient defaultHttpClient = new OkHttpClient.Builder()
.cookieJar(new JavaNetCookieJar(cookieManager))
.build()
Pomógł mi bez dodawania zależności od innych firm, z wyjątkiem tej z OkHttp.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-29 05:34:49
Tutaj działa implementacja CookieJar dla OkHttp3. Jeśli masz kilka instancji OkHttp3 (zazwyczaj powinieneś mieć tylko jedną instancję i używać jej jako singletone) powinieneś ustawić tę samą instancję cookiejar dla wszystkich klientów http, aby mogli udostępniać pliki cookie !!! Ta implementacja nie jest trwałe pliki cookie (wszystkie zostaną odrzucone przy ponownym uruchomieniu aplikacji), ale powinno być łatwe do wdrożenia SharedPreferences persistence zamiast listy plików cookie w pamięci (cookieStore).
CookieJar cookieJar = new CookieJar() {
private final HashMap<String, List<Cookie>> cookieStore = new HashMap<>();
@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
cookieStore.put(url.host(), cookies);
}
@Override
public List<Cookie> loadForRequest(HttpUrl url) {
List<Cookie> cookies = cookieStore.get(url.host());
return cookies != null ? cookies : new ArrayList<Cookie>();
}
};
OkHttpClient httpClient = new OkHttpClient.Builder()
.cookieJar(cookieJar)
.build();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-17 10:11:59
Użyłem franmontiel PeristentCookieJar biblioteki dla okhttp3 i retrofit.2. zaletą tego podejścia jest to, że nie trzeba manipulować żądaniem okhttp. Po prostu ustaw pliki cookie lub sesję podczas tworzenia retrofit
1. najpierw dodaj to do swojej kompilacji.gradle(Nazwa projektu) allprojects {
repositories {
jcenter()
maven { url "https://jitpack.io" }
}
}
2. dodaj to do swojej budowy.gradle
compile 'com.github.franmontiel:PersistentCookieJar:v1.0.1'
3. zbuduj tak
public static Retrofit getClient(Context context) {
ClearableCookieJar cookieJar = new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(context));
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.cookieJar(cookieJar)
.build();
if (retrofit==null) {
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build();
}
return retrofit;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-22 19:53:37
Minimalne rozwiązanie, które utrzymuje cookie po pierwszym uruchomieniu
public class SharedPrefCookieJar implements CookieJar {
Map<String, Cookie> cookieMap = new HashMap();
private Context mContext;
private SharedPrefsManager mSharedPrefsManager;
@Inject
public SharedPrefCookieJar(Context context, SharedPrefsManager sharedPrefsManager) {
mContext = context;
mSharedPrefsManager = sharedPrefsManager;
cookieMap = sharedPrefsManager.getCookieMap(context);
if (cookieMap == null) {
cookieMap = new HashMap<>();
}
}
@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
for (Cookie cookie : cookies) {
cookieMap.put(cookie.name(), cookie);
}
mSharedPrefsManager.setCookieMap(mContext, cookieMap);
}
@Override
public List<Cookie> loadForRequest(HttpUrl url) {
List<Cookie> validCookies = new ArrayList<>();
for (Map.Entry<String, Cookie> entry : cookieMap.entrySet()) {
Cookie cookie = entry.getValue();
if (cookie.expiresAt() < System.currentTimeMillis()) {
} else {
validCookies.add(cookie);
}
}
return validCookies;
}
}
Ze sztyletem
@Module
public class ApiModule {
@Provides
@Singleton
InstagramService provideInstagramService(OkHttpClient client)
{
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(InstagramService.BASE_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
InstagramService instagramService = retrofit.create(InstagramService.class);
return instagramService;
}
@Provides
@Singleton
OkHttpClient provideOkHttpClient(SharedPrefCookieJar sharedPrefCookieJar){
OkHttpClient client;
OkHttpClient.Builder builder = new OkHttpClient.Builder();
if(BuildConfig.DEBUG)
{
HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
builder
.addInterceptor(httpLoggingInterceptor)
.addInterceptor(new InstagramHeaderInterceptor())
.addNetworkInterceptor(new LoggingInterceptor());
}
client = builder.cookieJar(sharedPrefCookieJar).build();
return client;
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-06 21:55:39
Możesz spróbować w Kotlin :
val cookieJar = JavaNetCookieJar(CookieManager())
val url = "https://www.google.com/"
val requestBuilder = Request
.Builder()
.url(url)
.get()
val request = requestBuilder
.build()
val response = OkHttpClient.Builder()
.cookieJar(cookieJar)
.build()
.newCall(request)
.execute()
Gradle
dependencies {
implementation("com.squareup.okhttp3:okhttp:4.2.2")
implementation("com.squareup.okhttp3:okhttp-urlconnection:4.2.2")
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-20 14:24:34
Użyłem rozwiązania @ gncabrera, ale również stworzyłem klasę pomocniczą, aby pomóc w inicjalizacji, a także aby ułatwić udostępnianie pliku CookieJar w całej aplikacji.
public class OkHttpClientCreator {
private static CookieJar mCookieJar;
public static OkHttpClient.Builder getNewHttpClientBuilder(boolean isDebug, boolean useCookies) {
if (mCookieJar == null && useCookies) {
mCookieJar = new BasicCookieJar();
}
OkHttpClient.Builder builder = new OkHttpClient.Builder();
if (useCookies) {
builder.cookieJar(mCookieJar);
}
if (isDebug) {
builder.addInterceptor(new LoggingInterceptor());
}
return builder;
}
public static OkHttpClient getNewHttpClient(boolean isDebug, boolean useCookies) {
return getNewHttpClientBuilder(isDebug, useCookies).build();
}
}
Logging interceptor jest używany w trybie debugowania do drukowania informacji o żądaniu, a instancja cookie jar jest udostępniana. przez wywołujących tak, że jeśli żądania muszą korzystać ze wspólnego obsługi plików cookie, mogą. Te pliki cookie nie będą przechowywane podczas uruchamiania aplikacji, ale nie jest to wymagane dla mojej aplikacji, ponieważ używamy tokena sesje oparte i jedyną potrzebą Ciasteczek jest krótki czas między zalogowaniem się a wygenerowaniem tokena.
Uwaga: BasicCookieJar jest po prostu tą samą implementacją co mycookiejar gncabrera
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-22 22:33:33
Dodaj wdrożenie " com.squareup.okhttp3: okhttp-urlconnection: 3.8.1 " do Twojej kompilacji.gradle.
var interceptor = HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)
var cookieHandler: CookieHandler = CookieManager()
private var retrofit: Retrofit? = null
retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.client(client)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build()
private val client : OkHttpClient
private get() {
val builder = OkHttpClient.Builder()
builder.addNetworkInterceptor(interceptor)
builder.cookieJar(JavaNetCookieJar(cookieHandler))
builder.connectTimeout(15, TimeUnit.SECONDS)
builder.readTimeout(20, TimeUnit.SECONDS)
builder.writeTimeout(20, TimeUnit.SECONDS)
builder.retryOnConnectionFailure(true)
return builder.build()
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-16 19:13:09
Mogę pokazać ci bibliotekę pozwalającą OkHttp3 automatycznie obsługiwać pliki cookie. Można go łatwo używać.
Po prostu Zachowaj pliki cookie w pamięci, aby zrobić trwałość samodzielnie, jeśli potrzebujesz. Uruchom na Androidzie i czystym środowisku Java.
String url = "https://example.com/webapi";
OkHttp3CookieHelper cookieHelper = new OkHttp3CookieHelper();
OkHttpClient client = new OkHttpClient.Builder()
.cookieJar(cookieHelper.cookieJar())
.build();
Request request = new Request.Builder()
.url(url)
.build();
Gradle
compile 'org.riversun:okhttp3-cookie-helper:1.0.0'
Maven
<dependency>
<groupId>org.riversun</groupId>
<artifactId>okhttp3-cookie-helper</artifactId>
<version>1.0.0</version>
</dependency>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-25 09:55:22