2012-07-25 9 views
7

私のアンドロイドアプリでは、POSTリクエストを実行してサーバーからデータを取得しようとしています。getHttpResponseCode()はアンドロイド2.2で-1を返します

ApacheのHttpClientはもはやandroidによって管理されていないため、私はHttpURLConnectionクラスを使用してリクエストをしています。

ここは私がやっていることです。

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 URLでのみ発生し、HTTP URLでは発生しないことに注意してください。私はHttpsURLConnectionクラスを使いたくないのですが、時にはhttpも使いたいかもしれないからです。

私は、接続を維持するためだけに接続を閉じるつもりはありません。私は間違って何をしていますか?

+0

一定時間後にHttps接続が自動的に終了します(何も転送されていない場合)。私は実際には間違っている可能性がありますので、httpsの接続についてはあまりよく分かりません。 (それを読んで、私が何を言っても意味が分からないと確信していません) –

+0

-1は通常、HTTPコードで指定されていない理由で接続が失敗したときです。あなたのケースではタイムアウトのように聞こえるかもしれませんが、 DNS解決の失敗など...今、_why_特定のバージョンのAndroidがタイムアウトしていると、わかりません... – Basic

+0

私の考えは、間違っていないとすれば、この問題だけです私と一緒に? Web上で検索するので、私は誰もこの問題を発見しませんでした。 – 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を参考にしました

関連する問題