使用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>