使用OkHttp 3自动处理cookie
我正在使用okhttp 3.0.1。
每一个我得到的例子是与okhttp2的cookie处理
OkHttpClient client = new OkHttpClient(); CookieManager cookieManager = new CookieManager(); cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); client.setCookieHandler(cookieManager);
可以请一些人指导我如何在版本3中使用。setCookieHandler方法是不存在的版本3。
现在我正在玩它。 尝试PersistentCookieStore ,为JavaNetCookieJar添加gradle依赖关系:
compile "com.squareup.okhttp3:okhttp-urlconnection:3.0.0-RC1"
和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();
`
如果你想使用新的OkHttp 3 CookieJar并摆脱okhttp-urlconnection
依赖关系,你可以使用这个PersistentCookieJar 。
您只需要创build一个PersistentCookieJar
的实例,然后将其传递给OkHttp
构build器:
CookieJar cookieJar = new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(context)); OkHttpClient okHttpClient = new OkHttpClient.Builder() .cookieJar(cookieJar) .build();
在这里你有一个简单的方法来创build自己的CookieJar。 它可以随意扩展。 我所做的就是实现一个CookieJar,并用这个CookieJar使用OkHttpClient.Builder构buildOkHttpClient。
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>(); } }
这里是你如何创buildOkHttpClient
OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.cookieJar(new MyCookieJar()); OkHttpClient client = builder.build();
这里是为OkHttp3工作的CookieJar实现。 如果您有多个OkHttp3实例(通常应该只有一个实例并将其用作singlet),则应该为所有http客户端设置相同的cookiejar实例,以便共享cookie! 这个实现不是持久化cookie(它们将在应用程序重启时全部丢弃),但是应该很容易实现SharedPreferences持久性,而不是内存中的Cookie(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();
我用了franmont的PeristentCookieJar库来进行okhttp3和翻新。 这种方法的好处是:不需要操纵你的okhttp请求。 创build改造时只需设置cookie或会话
1.首先把这个添加到你的build.gradle(projectname)
allprojects { repositories { jcenter() maven { url "https://jitpack.io" } } }
2.将此添加到您的build.gradle
compile 'com.github.franmontiel:PersistentCookieJar:v1.0.1'
3.像这样build立改造
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; }
我使用了@ gncabrera的解决scheme,同时也创build了一个帮助类来帮助初始化,并且可以轻松地在整个应用程序中共享一个CookieJar。
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(); } }
在debugging模式下使用日志拦截器来打印请求信息,并且cookie jar实例是共享的。 跨呼叫者,这样如果请求需要使用通用的cookie处理程序,他们可以。 这些cookie不会在应用程序启动时持续存在,但这不是我的应用程序的要求,因为我们使用基于令牌的会话,只需要cookie就是login和生成令牌之间的短暂时间。
注意:BasicCookieJar和gncabrera的MyCookieJar一样
将compile "com.squareup.okhttp3:okhttp-urlconnection:3.8.1"
到您的build.gradle。
然后添加
CookieManager cookieManager = new CookieManager(); cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); OkHttpClient defaultHttpClient = new OkHttpClient.Builder() .cookieJar(new JavaNetCookieJar(cookieManager)) .build()
帮助我没有添加任何第三方依赖,除了从OkHttp。
我可以给你看一个让OkHttp3自动处理cookies的库。 它可以很容易地使用。
只要把cookies留在记忆里,如果你需要的话可以自己去做。 在Android和Pure 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();
摇篮
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>