私のアンドロイドアプリでは、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も使いたいかもしれないからです。
私は、接続を維持するためだけに接続を閉じるつもりはありません。私は間違って何をしていますか?
一定時間後にHttps接続が自動的に終了します(何も転送されていない場合)。私は実際には間違っている可能性がありますので、httpsの接続についてはあまりよく分かりません。 (それを読んで、私が何を言っても意味が分からないと確信していません) –
-1は通常、HTTPコードで指定されていない理由で接続が失敗したときです。あなたのケースではタイムアウトのように聞こえるかもしれませんが、 DNS解決の失敗など...今、_why_特定のバージョンのAndroidがタイムアウトしていると、わかりません... – Basic
私の考えは、間違っていないとすれば、この問題だけです私と一緒に? Web上で検索するので、私は誰もこの問題を発見しませんでした。 – Enigma