2012-10-13 38 views
6

URLConnection का उपयोग करते समय, 301 रीडायरेक्ट काम नहीं करता है, getHeaderFields() का उपयोग करके Location शीर्षलेख भी नहीं दिखाता है। यह एक खाली सूची है, नए एंड्रॉइड को छोड़कर (मैंने 4.1 का परीक्षण किया और यह काम किया)। ऐसा लगता है कि डिफ़ॉल्ट ब्राउज़र here में यह कुछ भी बताया गया है, हालांकि मेरे परीक्षण में यह एंड्रॉइड ब्राउज़र में काम करता था। क्या पुराने एंड्रॉइड में इस बग के लिए कुछ कामकाज है?301/302 एंड्रॉइड में काम नहीं कर रहा है (विभिन्न संस्करणों में अलग-अलग काम करता है)

मैंने कोशिश की:

URLConnection conn = u.openConnection(); 
HttpURLConnection conn = (HttpURLConnection) u.openConnection(); 
(conn).setInstanceFollowRedirects(true); 

लेकिन यह अभी भी एक खाली सूची देता है, नए Android में छोड़कर।

अद्यतन: यह एक संबंधित समस्या हो सकती है, ऐसा लगता है कि कभी-कभी URLConnection कुछ मामलों में भी अनुरोध नहीं भेज रहा है। (मैंने एमुलेटर के साथ एक पीसी पर वायरशर्क के साथ जांच की)। क्या इस बग के आसपास काम करने का कोई तरीका है?

अद्यतन: मैंने 3xx रीडायरेक्ट के लिए परीक्षण करने का प्रयास किया, रीडायरेक्ट ठीक काम किया, लेकिन सामान्य लिंक इयान के कुकी प्रबंधक के साथ काम नहीं कर पाए। openConnection के बाद सीधे यकीन setCookies बुलाया गया था करने के बाद, यह बहुत अच्छा काम करता है:

 URL u = new URL(_url); 
     ... 
     int tries = 4; 
     int code = 301; 
     URLConnection conn = null; 
     while (tries > 0 && code/100 == 3) { 
      conn = null; 
      conn = u.openConnection(); 
      _CM.setCookies(conn); 
      ((HttpURLConnection)conn).setInstanceFollowRedirects(false);//Required 
      code =((HttpURLConnection)conn).getResponseCode(); 
      if (code/100 == 3) { 
       String loc = conn.getHeaderField("Location"); 
       u = new URL(loc); 
      } 
     } 

     //conn.addRequestProperty("Accept-Encoding", "gzip"); 

     conn.connect(); 
     _CM.storeCookies(conn); 

वास्तव में अजीब बात FollowRedirect लाइन (टिप्पणी की "आवश्यक") नए Android (4.1 एमुलेटर) के लिए, है आवश्यक नहीं है। पुराने एंड्रॉइड (2.2) पर, यह Connection Reset by Peer त्रुटि देता है। शायद यही कारण है कि मेरा रीडायरेक्ट प्रयोगात्मक कोड 2.2 पर विफल रहा, 4.1 नहीं। कार्यक्षमता में अंतर के लिए कोई कारण? comments here के अनुसार, जेवीएम संस्करण के आधार पर पुनर्निर्देशन https के पास अलग-अलग व्यवहार हैं, क्या यह हो सकता है कि एंड्रॉइड का URL कनेक्शन/HTTPUrlConnection अलग-अलग संस्करणों में भी बदल गया है?

+0

तुमने कहा था (Apache Commons HttpClient के आधार पर) HTTP अनुरोध कभी-कभी सर्वर तक नहीं पहुंचता है, HTTP प्रतिक्रिया कोड 'conn.getResponseCode();' जब रीडायरेक्ट नहीं होता है? – yorkw

+0

विधि getResponseCode() को URLConnection – NoBugs

+1

प्रकार के लिए अपरिभाषित किया गया है, 'HttpURLConnection.getResponseCode();' http से संबंधित समस्या से निपटने पर, मैं हमेशा कुछ भी करने से पहले वास्तविक प्रतिक्रिया कोड प्राप्त करता हूं और जांचता हूं। – yorkw

उत्तर

2

नहीं URLConnection के बारे में निश्चित है, लेकिन मुझे पता है कि HttpClient रीडायरेक्ट का सम्मान करता है और हम इसे वापस एंड्रॉयड 2,1

http://developer.android.com/reference/org/apache/http/client/HttpClient.html

सभी तरह का उपयोग

+0

प्रश्न के अपने उत्तर का उत्तर नहीं दे सकता हूं, मैंने UrlConnection की सीमा के कारण पहले की समस्या पर इसका उपयोग किया है, लेकिन मैं इसे सभी को फिर से लिखना नहीं चाहूंगा। – NoBugs

+0

क्या यह https का समर्थन करता है? कुकीज़? – NoBugs

+0

मुझे नहीं पता कि यह क्या समर्थन नहीं करता है;) – pawelzieba