2009-08-30 18 views
20

से HttpClient 4 को रोकना I Apache HttpComponents लाइब्रेरी का उपयोग करके अपने ऐपइंजिन एप्लिकेशन से कनेक्ट कर रहा हूं। मेरे उपयोगकर्ताओं को प्रमाणीकृत करने के लिए, मुझे एप्लिकेशन के लॉगिन पते (http://myapp.appspot.com/_ah/login?auth=..) के साथ एक प्रमाणीकरण टोकन पास करने की आवश्यकता है और प्रतिक्रिया के शीर्षलेख से कुकी को पकड़ें। हालांकि, लॉगिन पृष्ठ रीडायरेक्ट स्टेटस कोड के साथ प्रतिक्रिया करता है, और मुझे नहीं पता कि एचटीपी क्लाइंट को रीडायरेक्ट का पालन करने से कैसे रोकें, इस प्रकार मुझे कुकी को अवरुद्ध करने से रोक दिया जाए।रीडायरेक्ट

Fwiw, अनुरोध भेजने के लिए उपयोग की जाने वाली वास्तविक विधि नीचे दी गई है।

private void execute(HttpClient client, HttpRequestBase method) { 
    // Set up an error handler 
    BasicHttpResponse errorResponse = new BasicHttpResponse(
      new ProtocolVersion("HTTP_ERROR", 1, 1), 500, "ERROR"); 

    try { 
     // Call HttpClient execute 
     client.execute(method, this.responseHandler); 
    } catch (Exception e) { 
     errorResponse.setReasonPhrase(e.getMessage()); 
     try { 
      this.responseHandler.handleResponse(errorResponse); 
     } catch (Exception ex) { 
      // log and/or handle 
     } 
    } 
} 

मैं क्लाइंट को रीडायरेक्ट का पालन करने से कैसे रोकूं?

धन्यवाद।

अद्यतन:

नीचे समाधान के अनुसार, मैं एक DefaultHttpClient client बनाने के बाद निम्नलिखित किया था (और यह execute विधि को पार करने से पहले):

if (!this.followRedirect) { 
    client.setRedirectHandler(new RedirectHandler() { 
     public URI getLocationURI(HttpResponse response, 
       HttpContext context) throws ProtocolException { 
      return null; 
     } 

     public boolean isRedirectRequested(HttpResponse response, 
       HttpContext context) { 
      return false; 
     } 
    }); 
} 

अधिक वर्बोज़ की तुलना में यह ऐसा लगता है होने की जरूरत है, लेकिन जैसा मैंने सोचा उतना मुश्किल नहीं है।

+1

ध्यान दें कि एक बार जब आप एक RedirectHandler सेट करते हैं जो बाद के अनुरोधों के लिए प्रभावी रहता है - न केवल यहां ब्याज का अनुरोध।इसलिए यदि आप आगे के अनुरोध जारी करने जा रहे हैं जिसके लिए उचित रूप से निष्पादित करने के लिए पुनर्निर्देशन की आवश्यकता हो सकती है तो आप निष्पादन के बाद क्लाइंट.सेट रेडियोधर्मी हैंडलर (नया DefaultRedirectHandler()) करना चाहेंगे। – Torid

उत्तर

6

एक RedirectHandler का उपयोग करें। से अपने कस्टम कार्यान्वयन को वापस करने के लिए DefaultHttpClient को विस्तारित करने की आवश्यकता हो सकती है।

+1

यदि आप अद्भुत एंड्रॉइड-एसिंक-http लाइब्रेरी का उपयोग कर रहे हैं, तो मैंने इसका एक फोर्क + पुल अनुरोध बनाया है जिसमें यह व्यवहार है: https://github.com/loopj/android-async-http/pull/184 –

0

एक त्वरित प्रस्तुत गूगल: http://hc.apache.org/httpclient-3.x/redirects.html

+0

जांच के लिए धन्यवाद, लेकिन लिंक HttpClient 3 के लिए है। मेरी समस्या यह है कि मैं एक एंड्रॉइड एप्लिकेशन लिख रहा हूं, और एंड्रॉइड एचटीपी क्लाइंट 4 के साथ आता है। दरअसल, अगर मैं कॉमन्स (3.x) एचटीपी क्लाइंट का उपयोग कर रहा था, तो मैं बस मेरे HttpMethod पर setFollowRedirects (false) को कॉल करें और इसके साथ किया जाए। जहां तक ​​मैं कह सकता हूं (और अगर कोई गलत है तो कृपया मुझे सही करें), यह एचटीपी कॉम्पोनेंट्स के साथ थोड़ा और जटिल (यदि संभव हो?) है। – mjumbewu

29

आप http पैरामीटर वाला यह कर सकते हैं:

final HttpParams params = new BasicHttpParams(); 
HttpClientParams.setRedirecting(params, false); 

विधि कोई जावाडोक है, लेकिन यदि आप स्रोत को देखने के आप इसे सेट देख सकते हैं:

HANDLE_REDIRECTS

जो नियंत्रित करता है :

परिभाषित करता है कि रीडायरेक्ट स्वचालित रूप से संभाला जाना चाहिए

1

RedirectHandler, पदावनत हो रहे हैं मैं DefaultHttpClient liks के लिए डिफ़ॉल्ट RedirectionStrategy बदलते इस से रीडायरेक्ट प्रतिक्रियाओं निम्नलिखित स्वचालित रूप से निष्क्रिय करने के लिए कामयाब रहे:

httpClient.setRedirectStrategy(new RedirectStrategy() { 
     @Override 
     public boolean isRedirected(HttpRequest httpRequest, HttpResponse httpResponse, HttpContext httpContext) throws ProtocolException { 
      return false; 
     } 

     @Override 
     public HttpUriRequest getRedirect(HttpRequest httpRequest, HttpResponse httpResponse, HttpContext httpContext) throws ProtocolException { 
      return null; 
     } 
    }); 

नकारात्मक पक्ष पर, यह हमें एक विशिष्ट करने के लिए टाई HttpClient के कार्यान्वयन लेकिन यह नौकरी करता है।

10

एचटीपी क्लाइंट के संस्करण 4.3.x के साथ सीधे clientBuilder में।

इसलिए जब यू अपने ग्राहक उपयोग का निर्माण:

CloseableHttpClient client = clientBuilder.disableRedirectHandling().build(); 

मैं अपने एक पुराने सवाल है, लेकिन मैं भी इस समस्या थी और मेरे समाधान साझा करना चाहते हैं।

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