对于post请求,我使用以下代码
public String executeHttpPost(String uri, String data) {
HttpURLConnection conn = null;
URL url = null;
String s = null;
try {
url = new URL(uri);
conn = (HttpURLConnection) url.openConnection();
if (conn instanceof HttpsURLConnection) {
Log.d("HTTPS", "HttpsUrl");
}
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.write(data);
wr.flush();
DisplayResponseHeaders(conn);
s = readStream(conn.getInputStream());
Log.d("body", s);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
s = null;
e.printStackTrace();
} finally {
conn.disconnect();
}
return s;
}当我在http上使用它的时候,一切都很好,但是在https上我得到了
java.io.EOFException
at libcore.io.Streams.readAsciiLine(Streams.java:203)
at libcore.net.http.HttpEngine.readResponseHeaders(HttpEngine.java:573)
at libcore.net.http.HttpEngine.readResponse(HttpEngine.java:821)
at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:283)
libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:177)
libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:271)
ru.fors.remsmed.fragment.NetHelper.executeHttpPost(NetHelper.java:234)
ru.fors.remsmed.LoginActivity$UserLoginTask.doInBackground(LoginActivity.java:424)
ru.fors.remsmed.LoginActivity$UserLoginTask.doInBackground(LoginActivity.java:1)
android.os.AsyncTask$2.call(AsyncTask.java:287)
java.util.concurrent.FutureTask.run(FutureTask.java:234)
android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
java.lang.Thread.run(Thread.java:856)
threadid=14: thread exiting with uncaught exception (group=0x40a71930)我发现了httpsurlconnection中有关回收连接错误的问题,以及可能的解决方案:
if (Build.VERSION.SDK != null && Build.VERSION.SDK_INT > 13) {
conn.setRequestProperty("Connection", "close");
}但这不是我的工作。
发布于 2014-02-12 09:48:59
尝试像这样修改代码:
conn.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded; charset: UTF-8");
byte[] output = data.getBytes("UTF-8");
conn.setFixedLengthStreamingMode(output.length);
os = conn.getOutputStream();
os.write(output);
os.flush();
os.close();
DisplayResponseHeaders(conn);
if (conn.getResponseCode() == 200) { // or other 2xx code like 204
s = readStream(conn.getInputStream());
Log.d("body", s);
}
else {
// handle error conditions like 404, 400, 500, ...
// now it may be necessary to read the error stream
InputStream errorStream = conn.getErrorStream();
// ...
}AFAIK您应该始终关闭您打开的所有流。我不确定conn.disconnect()是否为你这么做。
如果您想更方便地编写HTTP(S)请求,可以查看DavidWebb,其中有一个库列表可以帮助您避免使用繁琐的HttpURLConnection。
发布于 2015-01-08 16:40:52
这个EOFException建议这个响应是错误的--在标题之后可能缺少一个空行。在这种情况下,一些HTTP代码更为宽容,对我来说,iOS可以很好地处理我的服务器响应,但我正在使用HttpURLConnection在Android上获得EOFException。
我的服务器正在使用python,而我错误地假设我所需要做的一切都是为了表明成功是这样的:
self.send_response(200)这将发送初始响应标头行、服务器和日期头,但会使流处于您也可以发送其他标头的状态。HTTP需要在标头之后增加一个新行来指示它们已经完成。如果在尝试使用InputStream获取结果体HttpURLConnection或响应代码等时,没有出现这个新行,那么它将抛出EOFException (考虑到这一点,这实际上是合理的)。一些HTTP客户端确实接受了简短的响应,并报告了成功的结果代码,这可能导致我不公平地将矛头指向HttpURLConnection。
我更改了服务器,改为执行以下操作:
self.send_response(200)
self.send_header("Content-Length", "0")
self.end_headers()不再使用该代码的EOFException。"Connection: close“解决方案可能会在某些服务器上触发一些行为,这些服务器可能会在此范围内工作(例如,在关闭之前确保响应是有效的),但是python的情况并非如此,根本原因是我的错。
注意:在Android (2.2)中有一些与保持存活的连接有关的bugs -参见这里的博客文章:http://android-developers.blogspot.co.uk/2011/09/androids-http-clients.html。我还没有看到令人信服的证据,证明Android的新版本存在bug。
https://stackoverflow.com/questions/21723225
复制相似问题