में एंड्रॉइड ऐप में, मैं POST अनुरोध करके सर्वर से डेटा खींचने की कोशिश कर रहा हूं।getHttpResponseCode() एंड्रॉइड 2.2
मैं अनुरोध करने के लिए HttpURLConnection
कक्षा का उपयोग कर रहा हूं क्योंकि अपाचे के HttpClient
अब एंड्रॉइड द्वारा बनाए रखा नहीं गया है।
यहां मैं क्या कर रहा हूं।
private boolean callWS() {
try {
// To avoid the bug in httpurlconnection prior froyo which
// causes the getInputStream to return headers along with response
if (Build.VERSION.SDK_INT < 8)
System.setProperty("http.keepAlive", "false");
mHttpResponseCode = 0;
mErrorMessage = "";
// Initialize connection
URL connectURL = new URL(mServerUrl);
HttpURLConnection conn = (HttpURLConnection) connectURL.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setInstanceFollowRedirects(true);
conn.setReadTimeout(30000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("POST");
// Set some headers
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Accept-Encoding", "deflate, gzip");
connection.setRequestProperty("Content-Length", mParameters.length() + "");
// Connect to host
conn.connect();
// Write parameters to connection
OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
writer.write(mParameters);
writer.flush();
writer.close();
// Wait for http response code
mHttpResponseCode = conn.getResponseCode();
// Read response from connection
BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
ByteArrayBuffer baf = new ByteArrayBuffer(50);
int read = 0;
int bufSize = 1024;
byte[] buffer = new byte[bufSize];
while (true) {
read = bis.read(buffer);
if (read == -1)
break;
baf.append(buffer, 0, read);
}
// Decompress gzipped response
if (conn.getHeaderField("Content-Encoding") != null && conn.getHeaderField("Content-Encoding").contains("gzip"))
mResponseString = decompress(baf.toByteArray());
else
mResponseString = new String(baf.toByteArray());
mResponse.setResponse(mResponseString);
isWSCallSuccessfull = true;
} catch(UnknownHostException unknownHostException) {
isWSCallSuccessfull = false;
mErrorMessage = "Unknown host exception";
unknownHostException.printStackTrace();
mLogger.putStacktrace(unknownHostException);
} catch(SocketException socketException) {
isWSCallSuccessfull = false;
mErrorMessage = "Socket Exception";
socketException.printStackTrace();
mLogger.putStacktrace(socketException);
} catch(SocketTimeoutException socketTimeOutException) {
isWSCallSuccessfull = false;
mErrorMessage = "Socket Timeout Exception";
socketTimeOutException.printStackTrace();
mLogger.putStacktrace(socketTimeOutException);
} catch(SSLException sslException) {
isWSCallSuccessfull = false;
mErrorMessage = "SSL Exception";
sslException.printStackTrace();
mLogger.putStacktrace(sslException);
} catch(IOException ioException) {
isWSCallSuccessfull = false;
mErrorMessage = "IO Exception " + ioException.getMessage();
ioException.printStackTrace();
mLogger.putStacktrace(ioException);
}
mResponse.setHttpResponseCode(mHttpResponseCode);
mResponse.setErrorMessage(mErrorMessage);
mResponse.isWSCallSuccessful(isWSCallSuccessfull);
return isWSCallSuccessfull;
}
यह 2.2 डिवाइस चलाने वाले उपकरणों को छोड़कर प्रत्येक डिवाइस पर ठीक काम करता है (2.1 पर इसका प्रयास नहीं किया गया)।
2.2 में, यह ठीक काम करता है। लेकिन अगर मैं कोड के इस हिस्से को 30 से अधिक समय तक निष्क्रिय करता हूं, तो यह मुझे अगली बार http प्रतिक्रिया कोड के रूप में -1 के साथ देता है।
ध्यान देने योग्य एक और बात यह है कि यह केवल HTTPS urls के साथ होता है और HTTP यूआरएल के साथ नहीं होता है। मैं HttpsURLConnection क्लास का उपयोग नहीं करना चाहता क्योंकि कभी-कभी मैं http का भी उपयोग करना चाहता हूं।
मैं कनेक्शन को जीवित रखने के लिए कनेक्शन बंद नहीं कर रहा हूं। मैं क्या गलत कर रहा हूं?
क्या कुछ समय के बाद स्वचालित रूप से बंद हो जाता है (यदि कुछ भी स्थानांतरित नहीं किया जा रहा है तो मेरा मतलब है)? मुझे वास्तव में https कनेक्शन के बारे में बहुत कुछ नहीं पता है, इसलिए यह पूरी तरह से गलत हो सकता है। (इसे वापस पढ़ना मुझे यह भी यकीन नहीं है कि मैंने जो कहा है उसे समझ में आता है) –
-1 आमतौर पर एक कनेक्शन के लिए विफल रहता है जो HTTP कोड द्वारा निर्दिष्ट नहीं है - आपके मामले में यह एक टाइमआउट की तरह लगता है लेकिन यह भी हो सकता है DNS रिज़ॉल्यूशन विफलता, आदि हो ... अब, _why_ के रूप में एंड्रॉइड का एक विशिष्ट संस्करण समय समाप्त हो रहा है, मुझे नहीं पता ... – Basic
अच्छा मेरा विचार है कि अगर मैं कुछ भी गलत नहीं कर रहा हूं, तो क्या यह समस्या केवल मेरे साथ? क्योंकि वेब पर खोज करते हुए, मुझे कोई समस्या नहीं मिली। – Enigma