2012-07-25 13 views
7

Nella mia app Android, sto cercando di estrarre i dati dal server facendo una richiesta POST.getHttpResponseCode() restituisce -1 in Android 2.2

Sto utilizzando la classe HttpURLConnection per effettuare le richieste poiché Apache HttpClient non è più gestito da Android.

Ecco cosa sto facendo.

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; 
} 

Questo funziona perfettamente su tutti i dispositivi tranne i dispositivi che eseguono 2.2 (non provato su 2.1).

In 2.2, funziona correttamente. Ma se lascio questa parte di codice inattiva per più di 30 secondi, mi restituirà -1 come codice di risposta http la prossima volta.

Un'altra cosa da notare è che ciò accade solo con URL HTTPS e non con URL Url. Non voglio usare la classe HttpsURLConnection perché a volte potrei voler usare anche http.

Non sto chiudendo la connessione solo per mantenere in vita la connessione. Che cosa sto facendo di sbagliato?

+0

le connessioni Https si chiudono automaticamente dopo un certo periodo di tempo (se non viene trasferito nulla, intendo)? Non so molto delle connessioni HTTPS, quindi potrebbe essere completamente sbagliato. (Rileggendolo non sono nemmeno sicuro di quello che ho detto ha senso lol) –

+0

-1 di solito è quando una connessione fallisce per un motivo che non è specificato dal codice HTTP - nel tuo caso sembra un timeout ma potrebbe anche essere guasto risoluzione DNS, ecc ... Ora, per quanto riguarda _why_ una versione specifica di Android sta scadendo, non so ... – Basic

+0

Beh, la mia idea è se non sto facendo nulla di sbagliato, quindi è solo questo problema con Me? Perché la ricerca attraverso il web, ho trovato nessuno con questo problema. – Enigma

risposta

0

Se si desidera utilizzare HTTPS e HTTP, allo stesso tempo e non vuole creare una connessione separata -e se HttpsUrlConnection risolve il "-1 problema" è possibile utilizzare il seguente approccio:

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

Ho preso this rispondi come riferimento

Problemi correlati