次のコードを使用しています。(ServiceResponse はレスポンスをラップするためだけのオブジェクトです)
protected ServiceResponse executeHttpPostRequest(URL url,
Map<String, String> parameters) throws IOException {
String charset = "utf-8";
Set<String> keys = parameters.keySet();
StringBuffer query = new StringBuffer();
for (String key : keys) {
query.append(key);
query.append("=");
query.append(URLEncoder.encode(parameters.get(key), charset));
query.append("&");
}
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
if (Build.VERSION.SDK_INT > 13) {
connection.setRequestProperty("Connection", "close");
}
connection.setDoOutput(true);
connection.setChunkedStreamingMode(0);
connection.setRequestMethod("POST");
connection.setRequestProperty("Accept-Charset", charset);
connection.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded;charset=" + charset);
connection.setRequestProperty("Content-Length",
Integer.toString(query.length()));
OutputStream output = connection.getOutputStream();
output.write(query.toString().getBytes(charset));
ServiceResponse response = new ServiceResponse();
response.setHttpCode(connection.getResponseCode());
if (connection.getResponseCode() == 200 && connection.getContentLength() > 0) {
response.setInputStream(connection.getInputStream());
}
output.close();
return response;
}
HttpURLConnection.getResopnseCode または HttpURLConnection.getContentLength を呼び出したときに EOFException が発生し、サーバーは HTTP コード 200 のみで応答し、コンテンツは応答しませんでした。本文応答 (JSON) を持ち、正常に動作する他のサービス呼び出しで正確なメソッドを使用します。ここで同様の投稿を見て、運が悪いことに修正を適用しようとしました(そのため、「接続」が非常にセットアップされていることがわかります)。System.setProperty("http.keepAlive", "false");も使用しています。念のため。
アップデート
これはスタックトレースです
05-07 14:16:09.275: E/com.foo.android.InternalService(19594): java.io.EOFException
05-07 14:16:09.275: E/com.foo.android.InternalService(19594): at java.util.zip.GZIPInputStream.readFully(GZIPInputStream.java:206)
05-07 14:16:09.275: E/com.foo.android.InternalService(19594): at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:98)
05-07 14:16:09.275: E/com.foo.android.InternalService(19594): at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:81)
05-07 14:16:09.275: E/com.foo.android.InternalService(19594): at libcore.net.http.HttpEngine.initContentStream(HttpEngine.java:541)
05-07 14:16:09.275: E/com.foo.android.InternalService(19594): at libcore.net.http.HttpEngine.readResponse(HttpEngine.java:844)
05-07 14:16:09.275: E/com.foo.android.InternalService(19594): at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:283)
05-07 14:16:09.275: E/com.foo.android.InternalService(19594): at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:495)
05-07 14:16:09.275: E/com.foo.android.InternalService(19594): at com.foo.android.net.BaseServiceCall.executeHttpPostRequest(BaseServiceCall.java:100)
05-07 14:16:09.275: E/com.foo.android.InternalService(19594): at com.foo.android.InternalService.authentitate(InternalService.java:95)
05-07 14:16:09.275: E/com.foo.android.InternalService(19594): at com.foo.android.ui.LauncherActivity$1.work(LauncherActivity.java:70)
05-07 14:16:09.275: E/com.foo.android.InternalService(19594): at com.coredroid.util.BackgroundTask$BackgroundThread.run(BackgroundTask.java:74)