2012-07-25 13 views
7

में एंड्रॉइड ऐप में, मैं 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 का भी उपयोग करना चाहता हूं।

मैं कनेक्शन को जीवित रखने के लिए कनेक्शन बंद नहीं कर रहा हूं। मैं क्या गलत कर रहा हूं?

+0

क्या कुछ समय के बाद स्वचालित रूप से बंद हो जाता है (यदि कुछ भी स्थानांतरित नहीं किया जा रहा है तो मेरा मतलब है)? मुझे वास्तव में https कनेक्शन के बारे में बहुत कुछ नहीं पता है, इसलिए यह पूरी तरह से गलत हो सकता है। (इसे वापस पढ़ना मुझे यह भी यकीन नहीं है कि मैंने जो कहा है उसे समझ में आता है) –

+0

-1 आमतौर पर एक कनेक्शन के लिए विफल रहता है जो HTTP कोड द्वारा निर्दिष्ट नहीं है - आपके मामले में यह एक टाइमआउट की तरह लगता है लेकिन यह भी हो सकता है DNS रिज़ॉल्यूशन विफलता, आदि हो ... अब, _why_ के रूप में एंड्रॉइड का एक विशिष्ट संस्करण समय समाप्त हो रहा है, मुझे नहीं पता ... – Basic

+0

अच्छा मेरा विचार है कि अगर मैं कुछ भी गलत नहीं कर रहा हूं, तो क्या यह समस्या केवल मेरे साथ? क्योंकि वेब पर खोज करते हुए, मुझे कोई समस्या नहीं मिली। – Enigma

उत्तर

0

आप एक ही समय में उपयोग करने के लिए HTTPS और HTTP चाहते हैं और एक अलग कनेक्शन बनाने के लिए नहीं चाहता है -और अगर HttpsUrlConnection अपने "-1 मुद्दा" आप निम्नलिखित दृष्टिकोण का उपयोग कर सकते हल करती हैं:

URLConnection conn = new URL(url).openConnection(); 
if (conn instanceof HttpsURLConnection) { 
    // do stuff with cast to HttpsUrlConection 
} 
else { 
    // do stuff with cast to HttpUrlConnection 
} 

मैंने this संदर्भ