2009-08-31 8 views
34

मैं के माध्यम से Android के HttpURLConnection (आयातित org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection से), और प्रतिक्रिया प्राप्त करने की बात है, एक IOException फेंक दिया जाता है किसी GET भेजने के लिए कोशिश कर रहा हूँ :IOException: "प्राप्त प्रमाणीकरण चुनौती रिक्त है" (अपाचे सद्भाव/Android)

doRequestInternal में(): "प्राप्त प्रमाणीकरण चुनौती रिक्त है"

इस त्रुटि का क्या मतलब है, और यह है कि क्या कारण है? मैं प्राधिकरण शीर्षलेख में OAuth पैरामीटर लिख रहा हूं, लेकिन मैं इसे बिना किसी समस्या के अन्य मौकों पर भी करता हूं।

if (connection == null) { 
     connection = (HttpURLConnection) new URL(endpointUrl).openConnection(); 
     connection.setRequestMethod("GET"); 
    } 

    //... do some OAuth message signing 

    connection.connect(); 

    int statusCode = connection.getResponseCode(); // throws IOException 
+0

यह मेरे लिए काम है http://stackoverflow.com/a/9894629/3758898 –

उत्तर

50

मुझे कारण पता चला।

सबसे पहले, जो इस त्रुटि का अर्थ है (मुझे यकीन नहीं था) के बारे में पता नहीं है: सर्वर को 401 के साथ जवाब देने पर यह अपवाद फेंक दिया जाता है। बहुत सहज, यह विचार करते हुए कि इसे फेंक दिया गया था getResponseCode() (iow आप कभी भी 401 के लिए जांच नहीं कर पा रहे हैं, लेकिन इसके बजाय IOException को पकड़ना है ...)।

401 के लिए वास्तविक कारण यह था कि मैंने ओएथ सत्यापनकर्ता कोड नहीं भेजा था जहां इस बिंदु पर इसकी अपेक्षा की गई थी।

+0

हाय मैथियास, क्या आप ट्विटर एपीआई का उपयोग कर रहे थे? – MounirReg

+1

नहीं, मैं साइनपॉस्ट के लिए DefaultOAuthProvider कार्यान्वयन के हिस्से के रूप में इस समस्या में भाग गया, जो Apache HttpClient के बजाय HTTPUrlConnection का उपयोग करता है। – Matthias

+0

और क्या आपने साइनपॉस्ट से चिपकाया? मुझे एंड्रॉइड पर इसके साथ बहुत परेशानी हो रही है। –

13

हो सकता है कि किसी के लिए उपयोगी हो सकता है ...

यह अपवाद सिर्फ विकृत जवाब हेडर का अर्थ है: "WWW-प्रमाणित" शीर्षक नहीं मिला था। इसके अलावा, 401 कोड के साथ चुने गए उत्तरों समर्थित नहीं हैं, इसलिए आपको "सामग्री-लंबाई" शीर्षलेख (शून्य हो सकता है) की आवश्यकता होगी।

+0

या "प्रमाणीकरण" हेडर – Matthias

+4

क्लाइंट को "प्राधिकरण" हेडर भेजने की आवश्यकता है और यदि सर्वर को क्रेडेंशियल पसंद नहीं हैं तो उसे 'WWW-प्रमाणीकरण' वापस भेजने की आवश्यकता है। मेरे मामले में यह हमारा सर्वर है और यह केवल 'डब्ल्यूडब्ल्यूडब्लू-प्रमाणीकरण' भेज रहा था जब 'प्राधिकरण' हेडर गायब था। विषय में त्रुटि को ठीक करने के लिए जब प्राधिकरण विफल रहता है तो हमने 'WWW- प्रमाणीकरण' भेजने के लिए सर्वर-साइड पर परिवर्तन किया। – katit

4

बस अनुरोध (सर्वर साइड में) करने के लिए इस शीर्ष लेख:

WWW-Authenticate: None 
2

कृपया ध्यान दें कि दो प्रमाणीकरण दृष्टिकोण हैं कि: HTTP Authentication और token-based authentication। यदि आप HTTP प्रमाणीकरण का उपयोग कर रहे हैं तो आपको संदर्भित विनिर्देश का पालन करना होगा: WWW- प्रमाणीकृत सर्वर पक्ष पर हेडर फ़ील्ड, java.net.Authenticator स्थानीय रूप से आदि का उपयोग करें। यदि आप टोकन-आधारित प्रमाणीकरण का उपयोग कर रहे हैं तो स्पष्ट रूप से आपको कुकीज़ का उपयोग करने के लिए कुकीज़ का उपयोग करना होगा टोकन और लंबे समय तक रहने वाले सत्रों को जिंदा रखने में सक्षम बनाते हैं। ऐसे मामले में android.app.Application.onCreate()

CookieManager cookieManager = new CookieManager(); 
CookieHandler.setDefault(cookieManager); 

में अगले कोड डाल दिया और आप मुसीबतों के लिए नहीं होगा जब WWW-प्रमाणित हेडर फ़ील्ड के बिना सर्वर से HTTP 401 मत प्राप्त हुए।