许多人都知道新的应用程序应该使用HttpUrlconnection,因为Httpclient不能通过api 22.我在HttpClient中有以下代码成功发布到服务器然后我评论出来并交换HttpUrlconnection并且它没有发布。我的HttpUrlconnection代码可能有什么问题
URL url = new URL(LOGIN_URL);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.connect();
conn.setReadTimeout(10000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("POST");
String cert="username=user_777&password=76566";
conn.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
wr.writeBytes(cert);
wr.flush();
wr.close();
conn.disconnect();
HttpClient中的类似代码完美运行
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(LOGIN_URL);
List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(2);
nameValuePair.add(new BasicNameValuePair("username", "test_user"));
nameValuePair.add(new BasicNameValuePair("password", "123456789"));
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair));
HttpResponse response = httpClient.execute(httpPost);
Log.d("Http Post Response:", response.toString());
Httpclient有效,HttpUrlclient不能如何使其工作?它们都有相同的URL。
答案 0 :(得分:1)
问题是,当连接已经打开时,您正在调用conn.setDoOutput(true)
。
设置指示此URLConnection是否允许输出的标志。它 建立连接后无法设置。
将呼叫转移至conn.setDoOutput(true);
至conn.connect();
之前解决问题。
以下是我使用原始代码时出现的错误:
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:300)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Caused by: java.lang.IllegalStateException: Already connected
at java.net.URLConnection.checkNotConnected(URLConnection.java:464)
at java.net.URLConnection.setDoOutput(URLConnection.java:878)
这是完全正常工作和测试的代码,注意我添加了一些try / catch块并稍微移动了一些东西,还添加了代码来从服务器读取结果:
class MyAsyncTask extends AsyncTask<String, String, String> {
String LOGIN_URL = "http://www.example.com/someFile.php";
HttpURLConnection conn;
DataOutputStream wr;
StringBuilder result = new StringBuilder();
URL url;
@Override
protected String doInBackground(String... params) {
try {
url = new URL(LOGIN_URL);
conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true); //moved here
conn.connect();
} catch (IOException e) {
e.printStackTrace();
}
conn.setReadTimeout(10000);
conn.setConnectTimeout(15000);
try {
conn.setRequestMethod("POST");
} catch (ProtocolException e) {
e.printStackTrace();
}
String cert="name=user_777&message=7656666666";
try {
wr = new DataOutputStream(conn.getOutputStream());
wr.writeBytes(cert);
wr.flush();
wr.close();
InputStream in = new BufferedInputStream(conn.getInputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String line;
while ((line = reader.readLine()) != null) {
result.append(line);
}
} catch (IOException e) {
e.printStackTrace();
}
conn.disconnect();
return result.toString();
}
@Override
protected void onPostExecute(String result) {
Toast.makeText(MainActivity.this, result, Toast.LENGTH_LONG ).show();
}
}