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();
}
}
}
これは、IDEでのデバッグ中の監視が原因である可能性があります。 この回答 を参照してください。それは私に起こり、発見するのは困難でした。
conn.setDoInput(true);
とconn.setDoOutput(true);
の両方を呼び出しました。それらの1つを使用してください:
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();
...
}
....
誤解を招く例外かもしれません。 Jersey-2のこの欠陥を参照してください https://Java.net/jira/browse/JERSEY-2729
リンクが更新されました: https://github.com/jersey/jersey/issues/3001
基本的に問題は、ジャージが無効な例外をスローしていたことです。私の場合の本当の問題は、サーバーからの接続が拒否されたことでした。