2014-06-09 33 views
11

'u otomatik olarak takip etmesini nasıl önlersiniz? Android'de Retrofit kullanarak yapmaya çalıştığım bir kimlik doğrulama çağrısı var. Çağrı, bir başarı veya başarısızlık sayfasına 302 değerini döndürür. Orijinal 302 yanıtı, başarı üzerinde kimlik doğrulamayı sürdürmek için gereken bir oturum çerezi getiriyor, ancak çerezi kullanmaya başlama şansı elde etmeden önce, Retrofit isteği otomatik olarak yönlendirme URL'sine iletiyor.Retrofit'in 302

Yönlendirmeyi izlemeyi engellemenin bir yolu var mı? Ya da, ikinci aramayı yapmadan önce uygun başlığı ekleyebilecek bir retrofit üzerine bir yanıt işleyicisi yazmanın bir yolu var mı?

cevap

0

Sizin için benzer bir durumdaydım. Temel olarak tek ihtiyacımız olan, sunucunuzun yeniden yönlendirmeden önce döndürdüğü "Set-Çerez" başlığını yakalamaktır. Bu benim OkHTTP kullanarak nasıl başa şudur: büyük olasılıkla bir POST kullandığınız beri benim önceki cevabı kaydetmiştiniz

final OkHttpClient client = new OkHttpClient(); 
CookieHandler handler = client.getCookieHandler(); 
CookieManager manager = new CookieManager(); 
handler.setDefault(manager); 

//boilerplate: 
RequestBody formData = new FormEncodingBuilder() 
     .add("req_username", username) 
     .add("req_password", password).build(); 
Request request = new Request.Builder().url(LOGIN_URL).post(formData).build(); 
Response response = client.newCall(request).execute(); 
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); 

// print our cookies: 
List <HttpCookie> cookies = manager.getCookieStore().getCookies(); 
for(HttpCookie cookie : cookies) { 
    Log.v(TAG, cookie.getName() + "=" + cookie.getValue()); 
} 
0

giriş dinlenme api çağrılırken/PUT ve OkHttp olmayan GET veya HEAD isteği dönüşüyorsa Yeniden yönlendirme yapmadan önce bir GET isteği sizin için işe yaramayabilir.

Şu anda yönlendirmeleri devre dışı bırakma özelliği OkHttp'den eksik, ancak bunun için bir çekme isteği gönderdim. Bu çekme isteği kabul edilirse, bu kullanım durumuyla ilgili olarak sizin için tek tek ilgilenme fırsatı veren yeniden yönlendirmeyi devre dışı bırakmanıza izin vermelidir.

Burada belki hala kimse için yardımcı olacaktır, bu eski bir yazı olduğunu biliyoruz çekme isteği https://github.com/square/okhttp/pull/944

2

bu. Ben de benzer bir sorun var, benim çözüm HttpClient bir redirectStrategy (http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/RedirectStrategy.html) eklemek oldu: Bununla

private static final RestAdapter REST_ADAPTER= new RestAdapter.Builder() 
      .setEndpoint(HTTP_TEST_URL) 
      .setClient(new ApacheClient(HttpClients.custom() 
       .setRedirectStrategy(new RedirectStrategy() { 
        @Override 
        public boolean isRedirected(HttpRequest request, HttpResponse response, 
         HttpContext context) throws ProtocolException { 
         return response.getStatusLine().getStatusCode() == 302; 
        } 

        @Override 
        public HttpUriRequest getRedirect(HttpRequest request, 
         HttpResponse response, HttpContext context) 
         throws ProtocolException { 

         //String cookieValue = response.getFirstHeader("Set-Cookie").getValue(); 
         String location = response.getFirstHeader("location").getValue(); 

         HttpUriRequest request_= new HttpGet(location); 
         return request_; 
        }}).build())) 
      .build(); 

Ben (özel) olarak url erişim elde edebilirsiniz. Çerez verilerinin otomatik olarak eklendiğini düşünüyorum. Belki de özel ihtiyaçlarınızı iletmek için getRedirect(), isRedirected() işlevlerini yeniden yazmalısınız.

+0

Ve uygulamanıza doğru bağımlılık eklemeyi unutmayın yardımcı olur // hc .apache.org/HttpComponents-client-4.3.x/android-port.html. –

6

Eğer OkHttp 2 ile örneğin müşteri, yapılandırmak zorunda yönlendirmeyi engellemek için:

private sendRequest() { 
    OkHttpClient client = new OkHttpClient(); 
    client.setFollowRedirects(false); 

    connectAdapter = new RestAdapter.Builder() 
      .setClient(new OkClient(client)) 
      .setEndpoint("http://yourendpoint") 
      .setLogLevel(RestAdapter.LogLevel.FULL) 
      .build(); 

    connectAdapter.create(YourRequest.class).sendMyRequest("login","password"); 

} 

OKHTTP ile 3 (eğer @gropapa bu answer okuyabilir):

OkHttpClient.Builder builder = new OkHttpClient.Builder(); 
builder.followRedirects(false); 
OkHttpClient httpClient = builder.build(); 
+1

Bu, retrofit'e sahip bir yanıt döndürmek yerine, retrofit'in hata yapmasına neden olur. Bu beklenen davranış mıdır? –

+0

Bilmiyorum, benim durumumda sorun, 302'nin üstünde gerçekleşen bir yönlendirme idi. Hiçbir hata atılmadı. Sizin durumunuza retrofit ne tür bir hata atıyor? – Climbatize

+0

Hey, hala alakalı olup olmadığını bilmiyorum, ancak bir catch catch civarı ekleyebilir ve istisnadan yanıtı okuyabilirsiniz.Sığınakları takip etmemek için başka bir yol buluncaya, ama yine de cevabı okumaya çalışıncaya kadar bunu deneyin. – neristance

2

Olay eğer yazı çok eski, burada benim cevabım OkHttp 3 ile sadece aşağıdaki gibi kullanın:

OkHttpClient.Builder builder = new OkHttpClient.Builder(); 
builder.followRedirects(false); 
OkHttpClient httpClient = builder.build(); 
https: Bir Tepki nesnesi, sen

response.headers.get("Location") 

Hope yönlendirme url bulacaksınız (aslında Sonradan montaj kullanın) 210

bu

İlgili konular