2012-07-25 22 views
7

En mi aplicación de Android, estoy tratando de extraer datos del servidor haciendo una solicitud POST.getHttpResponseCode() devuelve -1 en android 2.2

Estoy usando la clase HttpURLConnection para realizar las solicitudes ya que HttpClient de Apache ya no es mantenido por android.

Esto es lo que estoy haciendo.

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

Esto funciona bien en todos los dispositivos excepto en los dispositivos con 2.2 (no lo intenté en 2.1).

En 2.2, funciona bien. Pero si dejo esta parte del código inactiva durante más de 30 segundos, me devuelve -1 como código de respuesta http la próxima vez.

Otra cosa a tener en cuenta es que esto solo ocurre con las URL HTTPS y no con las URL HTTP. No quiero usar la clase HttpsURLConnection porque a veces también quiero usar http.

No estoy cerrando la conexión solo para mantener viva la conexión. ¿Qué estoy haciendo mal?

+0

hago Https conexiones se cierran automáticamente después de un cierto período de tiempo (si no se está transfiriendo nada, quiero decir)? Realmente no sé mucho sobre las conexiones https, así que esto puede ser totalmente incorrecto. (Volviéndolo a leer ni siquiera estoy seguro de que lo que dije tenga sentido, lol) –

+0

-1 suele ser cuando una conexión falla por una razón que no está especificada por código HTTP; en su caso, suena como un tiempo de espera pero también podría hay una falla de resolución DNS, etc ... Ahora, en cuanto a _por qué_ una versión específica de Android se está agotando, no sé ... – Basic

+0

Bueno, mi idea es si no estoy haciendo nada mal, entonces este es el único problema ¿conmigo? Debido a que busca en la web, no encontré a nadie que tenga este problema. – Enigma

Respuesta

0

Si desea utilizar HTTPS y HTTP al mismo tiempo y no quiere crear una conexión separada -y si HttpsUrlConnection soluciona su "-1 tema" puede utilizar el siguiente enfoque:

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

Tomé this como referencia

Cuestiones relacionadas