web-dev-qa-db-ja.com

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にはありません。

30
user2672763

今私はそれで遊んでいます。 try PersistentCookieStoreJavaNetCookieJarの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();

`

33
1f7

新しい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();
51
franmontiel

ここでは、独自の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();
17
gncabrera

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以外のサードパーティの依存関係を追加せずに助けてくれました。

12
Shubham

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();
11
xyman

私は 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;
        }
4
iman kazemayni

最初の実行後に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;
    }
}
2
Vihaan Verma

@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と同じ実装です

0
Matt Wolfe