Java android httpclient可以工作,但我类似的HttpUrlconnection无法发布
正如你们中的许多人所知,新的应用程序应该使用HttpUrlconnection,因为Httpclient在api 22之后将无法工作。我在HttpClient中有下面的代码,它成功地发布到服务器,然后我在HttpUrlconnection中注释掉并交换,但它没有发布。我的HttpUrlconnection代码可能有什么问题Java android httpclient可以工作,但我类似的HttpUrlconnection无法发布,java,android,httpurlconnection,Java,Android,Httpurlconnection,正如你们中的许多人所知,新的应用程序应该使用HttpUrlconnection,因为Httpclient在api 22之后将无法工作。我在HttpClient中有下面的代码,它成功地发布到服务器,然后我在HttpUrlconnection中注释掉并交换,但它没有发布。我的HttpUrlconnection代码可能有什么问题 URL url = new URL(LOGIN_URL); HttpURLConnection conn = (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-HttpClient=newdefaulthttpclient();
HttpPost HttpPost=新的HttpPost(登录地址);
List nameValuePair=新的ArrayList(2);
添加(新的BasicNameValuePair(“用户名”、“测试用户”);
添加(新的BasicNameValuePair(“密码”,“123456789”);
setEntity(新的UrlEncodedFormEntity(nameValuePair));
HttpResponse response=httpClient.execute(httpPost);
Log.d(“Http Post响应:,Response.toString());
Httpclient工作,HttpUrlclient不工作如何使其工作?它们都有相同的URL。问题是,当连接已经打开时,您正在调用
conn.setDoOutput(true)
发件人:
设置指示此URLConnection是否允许输出的标志。信息技术
无法在建立连接后设置
将调用移动到conn.setDoOutput(true)代码>到连接()之前的连接()代码>修复了该问题
以下是我在使用您的原始代码时遇到的错误:
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();
}
}
类MyAsyncTask扩展了AsyncTask{
字符串登录\u URL=”http://www.example.com/someFile.php";
httpurl连接连接;
数据输出流;
StringBuilder结果=新建StringBuilder();
网址;
@凌驾
受保护的字符串doInBackground(字符串…参数){
试一试{
url=新url(登录\ url);
conn=(HttpURLConnection)url.openConnection();
conn.setDoOutput(true);//搬到这里
连接();
}捕获(IOE异常){
e、 printStackTrace();
}
连接设置读取超时(10000);
连接设置连接超时(15000);
试一试{
conn.setRequestMethod(“POST”);
}捕获(协议例外e){
e、 printStackTrace();
}
String cert=“name=user_777&message=76566666”;
试一试{
wr=新的DataOutputStream(conn.getOutputStream());
wr.writeBytes(证书);
wr.flush();
wr.close();
InputStream in=新的BufferedInputStream(conn.getInputStream());
BufferedReader reader=新的BufferedReader(新的InputStreamReader(in));
弦线;
而((line=reader.readLine())!=null){
结果。追加(行);
}
}捕获(IOE异常){
e、 printStackTrace();
}
连接断开();
返回result.toString();
}
@凌驾
受保护的void onPostExecute(字符串结果){
Toast.makeText(MainActivity.this,result,Toast.LENGTH_LONG).show();
}
}
非常感谢,我很欣赏这个深入的示例,现在我的代码运行得非常好。我还将阅读文档。