Автоматическая обработка cookie с помощью OkHttp 3

для меня, fopen() был очень медленным с файлами более 1mb, file() намного быстрее.

Просто пытаясь читать строки 100 за раз и создавать пакетные вставки, fopen() принимает 37 секунд против file() занимает 4 секунды. Должен быть, что string->array шаг встроен в file()

Я бы попробовал все параметры обработки файлов, чтобы увидеть, какая из них будет лучше работать в вашем приложении.

29
задан user2672763 19 January 2016 в 16:19
поделиться

6 ответов

Сейчас я играю с этим. Попробуйте PersistentCookieStore , добавьте зависимости gradle для JavaNetCookieJar :

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

`

32
ответ дан 1f7 19 January 2016 в 16:19
поделиться

Здесь у вас есть простой подход к созданию собственного CookieJar. Это может быть продлено, как вы хотите. Я реализовал CookieJar и создал OkHttpClient, используя OkHttpClient.Builder с этим CookieJar.

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();
16
ответ дан gncabrera 19 January 2016 в 16:19
поделиться

Добавление 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.

10
ответ дан Shubham 19 January 2016 в 16:19
поделиться

Здесь работает реализация CookieJar для OkHttp3. Если у вас есть несколько экземпляров OkHttp3 (обычно вы должны иметь только один экземпляр и использовать его как синглетон), вы должны установить один и тот же экземпляр cookiejar для всех клиентов http, чтобы они могли делиться файлами cookie !!! В этой реализации не сохраняются файлы cookie (все они будут удалены при перезапуске приложения), но должно быть легко реализовать постоянство SharedPreferences вместо списка файлов cookie в 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();
11
ответ дан xyman 19 January 2016 в 16:19
поделиться

Я могу показать вам библиотеку, позволяющую OkHttp3 автоматически обрабатывать файлы cookie. Его можно легко использовать.

Просто храните куки в памяти, чтобы сохранять настойчивость самостоятельно, если вам нужно. Запускать в среде 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();

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>
-1
ответ дан riversun 19 January 2016 в 16:19
поделиться

минимальное решение, которое сохраняется 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 19 January 2016 в 16:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: