android httpclient 工作,但我类似的 HttpUrlconnection 不工作 post
android httpclient works but my similar HttpUrlconnection does not post
你们中的许多人都知道新应用程序应该使用 HttpUrlconnection,因为 Httpclient 将无法工作超过 api 22. 我在 HttpClient 中有以下代码成功 posts 到服务器然后我评论说出并换入 HttpUrlconnection,它不会 post。我的 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.
问题是您在连接已打开时调用 conn.setDoOutput(true)
。
Sets the flag indicating whether this URLConnection allows output. It
cannot be set after the connection is established.
将对 conn.setDoOutput(true);
的调用移至 conn.connect();
之前解决了该问题。
这是我在使用您的原始代码时遇到的错误:
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask.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.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();
}
}
你们中的许多人都知道新应用程序应该使用 HttpUrlconnection,因为 Httpclient 将无法工作超过 api 22. 我在 HttpClient 中有以下代码成功 posts 到服务器然后我评论说出并换入 HttpUrlconnection,它不会 post。我的 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.
问题是您在连接已打开时调用 conn.setDoOutput(true)
。
Sets the flag indicating whether this URLConnection allows output. It cannot be set after the connection is established.
将对 conn.setDoOutput(true);
的调用移至 conn.connect();
之前解决了该问题。
这是我在使用您的原始代码时遇到的错误:
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask.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.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();
}
}