我尝试使用HttpURLClient使用下面显示的HttpRestClient
类将一些POST数据发送到服务器。执行时
conn.setDoInput(true);
我得到了
java.lang.IllegalStateException: Already connected
我卸载了应用程序,但仍然遇到同样的错误。
在所有示例中,我看到openConnection在setDoInput
之前被调用。如果,顾名思义,openConnection
打开一个连接,它应该永远不会在`setDoInput之前使用,对吗?我错过了什么?
可能在某些时候它在执行disconnect
之前崩溃了。这可能是原因吗?如果是这样,我该如何断开旧连接?
public class HttpRestClient {
static public int post(String urlStr, List<NameValuePair> data){
HttpURLConnection conn = null;
try {
URL url = new URL(urlStr);
conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestMethod("POST");
OutputStream os = conn.getOutputStream();
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(os, "UTF-8"));
writer.write(getQuery(data));
writer.flush();
writer.close();
os.close();
InputStream is = conn.getInputStream();
String dude = readIt(is);
return 1;
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return 0;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return 0;
}
finally {
if(conn!=null) conn.disconnect();
}
}
}
答案 0 :(得分:13)
这可能是由于在IDE中进行调试时手表造成的。见this answer。 它发生在我身上,很难发现。
答案 1 :(得分:3)
您同时调用了conn.setDoInput(true);
和conn.setDoOutput(true);
。使用其中一个:
setDoOutput(true)
用于POST
和PUT
次请求。setDoInput(true)
用于GET
请求。您所建立的连接很混乱,无法决定应该使用哪个请求。
在您的代码中:
static public int post(String urlStr, List<NameValuePair> data){
HttpURLConnection conn = null;
System.setProperty("http.keepAlive", "false"); // must be set
try {
...
conn.setDoOutput(true);
conn.setRequestMethod("POST");
// and connect to server, if needed
conn.connect();
...
}
....
答案 2 :(得分:1)
这可能是一个误导性的例外。请参阅Jersey-2 https://java.net/jira/browse/JERSEY-2729
的此缺陷