2014-06-09 13 views
11

के बाद स्वचालित रूप से रेट्रोफिट को कैसे रोकते हैं मेरे पास एक प्रमाणीकरण कॉल है कि मैं एंड्रॉइड पर रेट्रोफिट का उपयोग करने की कोशिश कर रहा हूं। कॉल सफलता या विफलता पृष्ठ पर 302 लौटाता है। मूल 302 प्रतिक्रिया सफलता पर प्रमाणीकरण बनाए रखने के लिए आवश्यक एक सत्र कुकी वापस लाती है, हालांकि कुकी को उपभोग करने का मौका मिलने से पहले रेट्रोफिट स्वचालित रूप से रीडायरेक्ट यूआरएल को अनुरोध सौंप रहा है।आप 302

क्या रीडायरेक्ट का पालन करने से रोकने का कोई तरीका है? या क्या रेट्रोफिट पर एक प्रतिक्रिया हैंडलर लिखने का कोई तरीका है जो दूसरी कॉल करने से पहले उचित शीर्षलेख जोड़ सकता है?

उत्तर

0

मैं आपकी तरह की स्थिति में था। असल में हमें केवल "सेट-कुकी" हेडर को कैप्चर करना है जिसे आपका सर्वर रीडायरेक्ट करने से पहले लौटाता है। यह मैं इसे कैसे OkHTTP का उपयोग करके किया है:

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

मैं अपने पिछले जवाब संपादित कर लिया है के बाद से आप सबसे अधिक संभावना एक पोस्ट का उपयोग कर रहे/डाल जब अपना लॉगिन बाकी एपीआई बुला और OkHttp किसी भी गैर GET या HEAD अनुरोध में धर्मान्तरित रीडायरेक्ट करने से पहले एक अनुरोध प्राप्त करें जो शायद आपके लिए काम नहीं करेगा।

वर्तमान में रीडायरेक्ट को अक्षम करने की सुविधा ओकेएचटीपी से गायब है लेकिन मैंने इसके लिए एक पुल अनुरोध सबमिट कर दिया है। यदि और जब उस पुल अनुरोध को स्वीकार किया जाता है तो उसे आपको रीडायरेक्ट को अक्षम करने की अनुमति देनी चाहिए जिससे आपको इस समय के उपयोग के मामले को अपने आप से निपटने का अवसर मिल सके।

यहाँ खींच अनुरोध https://github.com/square/okhttp/pull/944

2

मैं जानता हूँ कि यह एक पुरानी पोस्ट है, हो सकता है यह अभी भी किसी के लिए मदद मिलेगी। मैं एक ऐसी ही समस्या है, मेरी समाधान httpclient करने के लिए एक redirectStrategy (http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/RedirectStrategy.html) जोड़ने के लिए किया गया था:

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

इसके साथ ही मैं किसी भी (निजी) यूआरएल के लिए उपयोग कर सकते हैं। मुझे लगता है कि कुकी डेटा स्वचालित रूप से जोड़ा गया है। शायद आपको अपनी विशेष जरूरतों को पारित करने के लिए getRedirect(), isRedirected() फ़ंक्शंस को फिर से लिखना चाहिए।

+0

और अपने अनुप्रयोग के लिए सही निर्भरता को जोड़ने के लिए याद: https: // hc .apache.org/httpcomponents-ग्राहक-4.3.x/android-port.html। –

6

रीडायरेक्ट आप OkHttp 2 के साथ अपने ग्राहक, जैसे कॉन्फिगर करना रोकने के लिए:

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 के साथ 3 (आप इस answer @gropapa से पढ़ सकते हैं):

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

यह प्रतिक्रिया को वापस करने के बजाय रेट्रोफिट का कारण बनता है, जिसमें 303 है। क्या यह अपेक्षित व्यवहार है? –

+0

मुझे नहीं पता, मेरे मामले में समस्या 302 के शीर्ष पर हुई एक पुनर्निर्देशन थी। कोई त्रुटि नहीं फेंक दी गई थी। आपके मामले में रीट्रोफिट फेंकने में किस तरह की त्रुटि है? – Climbatize

+0

अरे, मुझे नहीं पता कि यह अभी भी प्रासंगिक है लेकिन आप कोशिश करने के लिए प्रयास करें और अपवाद से प्रतिक्रिया पढ़ें।तब तक बोएं जब तक कोई अन्य तरीका रीडायरेक्ट का पालन नहीं करता है लेकिन फिर भी प्रतिक्रिया पढ़ रहा है, आप इसे पकड़ने के प्रयास के साथ कर सकते हैं। – neristance

2

घटना अगर पोस्ट बहुत पुराना है, ओकेएचटीपी 3 के साथ मेरा जवाब यहां है कि बिल्डर को निम्नलिखित

OkHttpClient.Builder builder = new OkHttpClient.Builder(); 
builder.followRedirects(false); 
OkHttpClient httpClient = builder.build(); 
के रूप में उपयोग करें 210

एक रिस्पांस वस्तु (मैं रेट्रोफिट का उपयोग वास्तव में), तो आप में

response.headers.get("Location") 

आशा पुनर्निर्देश url मिल जाएगा में इस मदद करता है

संबंधित मुद्दे