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にはありません。
今私はそれで遊んでいます。 try PersistentCookieStore 、JavaNetCookieJarのgradle依存関係を追加します:
compile "com.squareup.okhttp3:okhttp-urlconnection:3.0.0-RC1"
および初期化
// 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 。
PersistentCookieJar
のインスタンスを作成して、それをOkHttp
ビルダーに渡すだけです。
CookieJar cookieJar =
new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(context));
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.cookieJar(cookieJar)
.build();
ここでは、独自のCookieJarを作成する簡単なアプローチがあります。必要に応じて拡張できます。私がしたことは、CookieJarを実装し、このCookieJarでOkHttpClient.Builderを使用してOkHttpClientを構築することです。
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>();
}
}
OkHttpClientを作成する方法は次のとおりです。
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.cookieJar(new MyCookieJar());
OkHttpClient client = builder.build();
Build_gradleにcompile "com.squareup.okhttp3:okhttp-urlconnection:3.8.1"
を追加します。
そして追加
CookieManager cookieManager = new CookieManager();
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
OkHttpClient defaultHttpClient = new OkHttpClient.Builder()
.cookieJar(new JavaNetCookieJar(cookieManager))
.build()
okHttp以外のサードパーティの依存関係を追加せずに助けてくれました。
OkHttp3のCookieJar実装の動作を次に示します。 OkHttp3のインスタンスが複数ある場合(通常は1つのインスタンスのみを使用し、シングルトーンとして使用する必要があります)、Cookieを共有できるように、すべてのhttpクライアントにcookiejarの同じインスタンスを設定する必要があります!!!この実装はcookieを永続化するものではありません(アプリケーションの再起動時にすべて破棄されます)が、cookies(cookieStore)のメモリ内リストの代わりにSharedPreferences永続化を簡単に実装する必要があります。
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();
私は franmontiel PeristentCookieJar okhttp3とretrofit.2のライブラリを使用しました。このアプローチの利点は、okhttpリクエストを操作する必要がないことです。レトロフィットを作成するときにクッキーまたはセッションを設定するだけ
allprojects {
repositories {
jcenter()
maven { url "https://jitpack.io" }
}
}
compile 'com.github.franmontiel:PersistentCookieJar:v1.0.1'
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;
}
最初の実行後にCookieを保持する最小限のソリューション
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;
}
}
短剣付き
@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;
}
}
@gncabreraのソリューションを使用しましたが、初期化を支援し、アプリケーション全体で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();
}
}
ロギングインターセプターは、デバッグモードで要求情報を出力するために使用され、Cookie jarインスタンスは共有されます。要求者が共通のCookieハンドラーを使用する必要がある場合に、呼び出し元で使用できるようにします。これらのCookieはアプリの起動後は保持されませんが、トークンベースのセッションを使用し、Cookieの唯一の必要性はログインとトークンの生成の間の短い時間であるため、これはアプリケーションの要件ではありません。
注:BasicCookieJarは、gncabreraのMyCookieJarと同じ実装です