2015-09-02 15 views
5

Android uygulamamda birkaç async istekleri ile okhttp kitaplığı kullanıyorum. Tüm istekler, belirtecin başlığa ayarlanmasını gerektirir. Bazen, sağlanan RefreshToken'i kullanarak bu tokeyi yenilemem gerekiyor, bu yüzden OkHttp'in Authenticator sınıfını kullanmaya karar verdim.Okhttp authenticator çoklu okuma

2 veya daha fazla zaman uyumsuz istekleri sunucudan 401 kodu yaklaşık olarak aynı anda aldığında ne olur? Authenticator'ın yöntem misiniz 401 aldık,

@Override 
public Request authenticate(Proxy proxy, Response response) throws IOException 
{     
    return null; 
} 

her istek için çağrılabilir ya da sadece bir kez ilk istek için çağrılır?

Simge nasıl yenilenir?

cevap

1

Burada çalıştığınız API'nın nasıl çalıştığını temel alan iki senaryo görüyorum. eskisini aşımına uğramayacak yeni kimlik bilgilerini (örneğin erişim belirteci) çağırarak -

Birincisi işlemek için kesinlikle daha kolaydır. Bunu başarmak için, kimlik bilgilerinizin yenilenmekte olduğunu söylemek için kimlik bilgilerinize ek bir bayrak ekleyebilirsiniz. 401 cevabınız olduğunda, bayrağı doğru olarak ayarlarsınız, yeni kimlik bilgileri almak için istekte bulunursunuz ve bunları yalnızca bayrak eşitse, yalnızca ilk müdahalenin ele alınacağı ve geri kalanının göz ardı edileceği anlamına gelir. Bayrağa erişiminizin senkronize olduğundan emin olun.

başka senaryo biraz daha karmaşıktır - Yeni kimlik bilgilerini eskisini diyoruz her zaman sunucu tarafında tarafından süresi edilecek ayarlanır. Bunu işlemek için semafor olarak kullanılacak yeni bir nesne tanıtacağım - 'kimlik bilgileri yenilenirken' her zaman engellenir. Yalnızca bir 'yenileme kimlik bilgisi' araması yapacağınızdan emin olmak için, bayrakla senkronize edilen kod bloğunda onu çağırmanız gerekir. Öyle bakabilirsiniz: 401 yanıt aldı aşağıdaki istekleri tarafından yeni kimlik bilgilerini talep eden iptal etmek için ekstra bir onay if(!stateObject.isBeingRefreshed) return; orada fark etmiş olduğunuz gibi

synchronized(stateObject) { 
    if(!stateObject.isBeingRefreshed) return; 
    Response response = client.execute(request); 
    apiClient.setCredentials(response.getNewCredentials()); 
    stateObject.isBeingRefreshed = false; 
} 

.

+0

Bu şekilde, döndürülen istekleri kaybedersiniz, değil mi? Aşağıya koyduğum şekilde, bu istekleri tekrar arayabilirsin. – antonicg

+0

Hangi senaryoyu kastediyorsunuz? Sunucu yeni erişim oluşturulduğunda eski erişim belirtecinin süresinin dolmasına izin vermiyorsa, bunu engellemeniz gerekmez ve herhangi bir kayıp olduğunda sorun olmaz, çünkü hala çalışan bir erişim belirtecimiz olur. Elbette sisteminizin nasıl çalıştığını savunur. İkinci senaryoda, ilk etapta daha fazla 'yenileme erişim belirteci' isteklerinin çağrılmasını nasıl önleyeceğimi açıkladım (senkronize blok bunu engelleyecektir), böylece hiçbir şey kaybolacaktır. –

+0

Bu doğrudur, eski sürenin dolmasına izin verilmediyse eski istekleri engellemek için sunucuya gerek yoktur. Aclaration için teşekkürler. – antonicg

1

Durumumda, Tekton kalıbı kullanarak Authenticator'u uyguladı. Bu yöntemi authenticate senkronize edebilirsiniz. (Tasdik metodunun params alınan Response nesneden Request nesne alma) isteğinden belirteç cihazda kaydedilmiş aynı ise yaptığı uygulamada, ben kontrol (Ben SharedPreferences nesnesinde belirteci kaydedin). belirteç aynıysa

, yani henüz refresed edilmemiştir anlamına gelir, bu yüzden tekrar belirteç yenileme ve mevcut talebi yürütün. belirteç aynı değilse

, yani daha önce yenilendi demektir, bu yüzden cihazda kayıtlı belirteci kullanarak tekrar isteği yürütmek ama.

Daha fazla yardıma ihtiyacınız varsa, lütfen bana söyleyin ve buraya kod koyacağım.

+1

Bence, eşzamanlı hale getirmek için "uygula" yerine "taahhüt" yöntemiyle jetonun kaydedilmesi gereken bilgileri eklemek iyi olur. –

+0

Evet @KrzysztofSkrzynecki, iyi nokta. Bunu unutmayı unuttum. – antonicg

+0

Hi @antonicg. Biraz kod verebilir misiniz? Farklı iş parçacığının aynı anda yenilemeye çalıştığı durumları işlemek için bir yol bulmaya çalışıyorum. Cevabınız benim problemimi çözebiliyormuş gibi geliyor, ama senkronizasyon benim takılıp kaldığım yer değil. – JPM