में ट्राई/कैच का उपयोग कर मैं अपने एंड्रॉयड आवेदन से नेटवर्क अनुरोध करने के लिए उपयोग कर रहा हूँ HttpUrlConnection
बिना 401 प्रतिक्रिया प्राप्त करने के लिए। सबकुछ एक चीज को छोड़कर ठीक काम करता है, 401. जब भी सर्वर स्टेटस कोड 401 के साथ प्रतिक्रिया देता है, तो मेरा ऐप को "no authentication challenge found"
बताते हुए संदेश के साथ फेंकता है। इसे गुगल करने के बाद, मुझे एक भी समाधान नहीं मिला है, लेकिन केवल वर्कअराउंड (कोशिश/पकड़ का उपयोग करके इसे संभालने, इसे 401 प्रतिक्रिया मानते हुए)।यह कैसे से निपटने के एंड्रॉयड
public Bundle request(String action, Bundle params, String cookie) throws FileNotFoundException, MalformedURLException, SocketTimeoutException,
IOException {
OutputStream os;
String url = baseUrl + action;
Log.d(TAG, url);
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
conn.setConnectTimeout(30 * 1000);
conn.setReadTimeout(30 * 1000);
conn.setRequestProperty("User-Agent", System.getProperties().getProperty("http.agent") + "AndroidNative");
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setDoOutput(true);
conn.setDoInput(true);
if (cookie != null) {
conn.setRequestProperty("Cookie", cookie);
}
if (params != null) {
os = conn.getOutputStream();
os.write(("--" + boundary + endLine).getBytes());
os.write((encodePostBody(params, boundary)).getBytes());
os.write((endLine + "--" + boundary + endLine).getBytes());
uploadFile(params, os);
os.flush();
os.close();
}
conn.connect();
Bundle response = new Bundle();
try {
response.putInt("response_code", conn.getResponseCode());
Log.d(TAG, conn.getResponseCode() + "");
response.putString("json_response", read(conn.getInputStream()));
List<String> responseCookie = conn.getHeaderFields().get("set-cookie");
// Log.d(TAG, responseCookie.get(responseCookie.size() - 1));
response.putString("cookie", responseCookie.get(responseCookie.size() - 1));
} catch (SocketTimeoutException e) {
throw new SocketTimeoutException(e.getLocalizedMessage());
} catch (FileNotFoundException e) {
throw new FileNotFoundException(e.getLocalizedMessage());
} catch (IOException e) {
e.printStackTrace();
response.putInt("response_code", HttpURLConnection.HTTP_UNAUTHORIZED);
response.putString("json_response", read(conn.getErrorStream()));
}
// debug
Map<String, List<String>> map = conn.getHeaderFields();
for (String key : map.keySet()) {
List<String> values = map.get(key);
for (String value : values) {
Log.d(key, value);
}
}
conn.disconnect();
return response;
}
मैं सच में जानना चाहते हैं, क्यों इस अपवाद फेंक दिया जाता है:
यहाँ कोड का टुकड़ा है? प्रमाणीकरण चुनौती का क्या अर्थ है? प्रमाणीकरण चुनौती कैसे प्रदान करें? इस स्थिति को दूर करने के लिए मुझे अपने कोड में क्या परिवर्तन करना है?
कृपया मुझे प्रबुद्ध .. :)
मुझे लगता है कि चाहते हैं तो इसका मतलब है कि सर्वर एक 401 त्रुटि कोड के साथ जवाब दिया लेकिन 'WWW-Authenticate' हैडर जो प्रमाणीकरण चुनौती का वर्णन छोड़े गए। – Jens
सर्वर को 'डब्ल्यूडब्ल्यूडब्लू-प्रमाणीकरण' हेडर मिला है, लेकिन फिर भी मुझे यह त्रुटि मिल रही है। – jtanveer
मैं सिर्फ इस में भाग गया, और यह भी समझ नहीं कैसे इसे 'getResponseCode के बाद से IOException (पकड़ने()' ही 'कनेक्ट के रूप में ही IOException (फेंक देते हैं) के बाद एक 401 है ग्रहण करने के लिए बिना इस प्रतिक्रिया कोड वापस पाने के लिए/getInputStream()/getOutputStream() ')। स्टैकट्रेस से ऐसा लगता है 'org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.processAuthHeader (HttpURLConnectionImpl.java:1153)' श्रृंखला अपवाद ऊपर फेंकने के लिए जिम्मेदार (है, हालांकि मैं नहीं कर सका आगे किसी भी गोता लगाएँ)। –