在Android上使用HttpPost时出错
我正在尝试将安卓系统的文本输入到网站中,我了解到httppost是一个不错的选择。我下载了HttpClient 4.2.2(GA)tar.gz,解压缩它们,并将7个jar复制到Eclipse中android项目的lib文件夹中。我很确定我得到了所有的罐子,因为它们与网站上列出的那些相匹配 然后,我继续从以下位置复制并粘贴顶部教程: 我导入了所有内容,但留下了以下错误:在Android上使用HttpPost时出错,android,http-post,Android,Http Post,我正在尝试将安卓系统的文本输入到网站中,我了解到httppost是一个不错的选择。我下载了HttpClient 4.2.2(GA)tar.gz,解压缩它们,并将7个jar复制到Eclipse中android项目的lib文件夹中。我很确定我得到了所有的罐子,因为它们与网站上列出的那些相匹配 然后,我继续从以下位置复制并粘贴顶部教程: 我导入了所有内容,但留下了以下错误: EntityUtils.consume(entity1); //X } finally { htt
EntityUtils.consume(entity1); //X
} finally {
httpGet.releaseConnection(); //X
这部分代码在教程中有两处,两处都会出现错误。
Eclipse对第一行说:
“类型EntityUtils的方法consume(HttpEntity)未定义。”
第二行:
“HttpGet类型的方法releaseConnection()未定义。”
我很确定我下载了每个罐子,正确地运输了它们,并且导入了所有的东西。是什么造成了这个错误?谢谢
package com.example.myapp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.params.HttpClientParams;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.widget.Toast;
public class BalanceCheckerActivity extends Activity {
private final String LOGIN_URL = "https://someloginsite.com"; //username and password
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_balance_checker);
String username = getIntent().getExtras().getString("username");
String password = getIntent().getExtras().getString("password");
//Building post parameters, key and value pair
List<NameValuePair> accountInfo = new ArrayList<NameValuePair>(2);
accountInfo.add(new BasicNameValuePair("inputEnterpriseId", username));
accountInfo.add(new BasicNameValuePair("password", password));
//Creating HTTP client
HttpClient httpClient = new DefaultHttpClient();
//Creating HTTP Post
HttpPost httpPost = new HttpPost(LOGIN_URL);
BasicHttpParams params = new BasicHttpParams();
params.setParameter("inputEnterpriseID", username);
params.setParameter("password", password);
httpPost.setParams(params);
//Url Encoding the POST parameters
try {
httpPost.setEntity(new UrlEncodedFormEntity(accountInfo));
}
catch (UnsupportedEncodingException e) {
// writing error to Log
e.printStackTrace();
startActivity(new Intent(this, AccountInputActivity.class));
}
HttpResponse response = null;
InputStreamReader iSR = null;
String source = null;
// Making HTTP Request
try {
response = httpClient.execute(httpPost);
// writing response to log
Log.d("Http Response:", response.toString());
iSR = new InputStreamReader(response.getEntity().getContent());
BufferedReader br = new BufferedReader(iSR);
source = "";
while((source = br.readLine()) != null)
{
source += br.readLine();
}
} catch (ClientProtocolException e) {
// writing exception to log
e.printStackTrace();
startActivity(new Intent(this, AccountInputActivity.class));
} catch (IOException e) {
// writing exception to log
e.printStackTrace();
startActivity(new Intent(this, AccountInputActivity.class));
}
System.out.println(source);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_balance_checker, menu);
return true;
}
}
这是我现在拥有的。Edward,我使用了你方法中的一些代码,但只是把它们放到了onCreate中。然而,这是行不通的。从上一个活动转到本活动几秒钟后,我收到一条消息,应用程序“意外停止”
我有一个关于将字符串输入到网站文本字段的问题:我是否使用HttpParams的NameValuePairs?这是我的密码,你能看出来是怎么回事吗?谢谢
package com.example.myapp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.params.HttpClientParams;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.widget.Toast;
public class BalanceCheckerActivity extends Activity {
private final String LOGIN_URL = "https://someloginsite.com"; //username and password
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_balance_checker);
String username = getIntent().getExtras().getString("username");
String password = getIntent().getExtras().getString("password");
//Building post parameters, key and value pair
List<NameValuePair> accountInfo = new ArrayList<NameValuePair>(2);
accountInfo.add(new BasicNameValuePair("inputEnterpriseId", username));
accountInfo.add(new BasicNameValuePair("password", password));
//Creating HTTP client
HttpClient httpClient = new DefaultHttpClient();
//Creating HTTP Post
HttpPost httpPost = new HttpPost(LOGIN_URL);
BasicHttpParams params = new BasicHttpParams();
params.setParameter("inputEnterpriseID", username);
params.setParameter("password", password);
httpPost.setParams(params);
//Url Encoding the POST parameters
try {
httpPost.setEntity(new UrlEncodedFormEntity(accountInfo));
}
catch (UnsupportedEncodingException e) {
// writing error to Log
e.printStackTrace();
startActivity(new Intent(this, AccountInputActivity.class));
}
HttpResponse response = null;
InputStreamReader iSR = null;
String source = null;
// Making HTTP Request
try {
response = httpClient.execute(httpPost);
// writing response to log
Log.d("Http Response:", response.toString());
iSR = new InputStreamReader(response.getEntity().getContent());
BufferedReader br = new BufferedReader(iSR);
source = "";
while((source = br.readLine()) != null)
{
source += br.readLine();
}
} catch (ClientProtocolException e) {
// writing exception to log
e.printStackTrace();
startActivity(new Intent(this, AccountInputActivity.class));
} catch (IOException e) {
// writing exception to log
e.printStackTrace();
startActivity(new Intent(this, AccountInputActivity.class));
}
System.out.println(source);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_balance_checker, menu);
return true;
}
}
package com.example.myapp;
导入java.io.BufferedReader;
导入java.io.IOException;
导入java.io.InputStreamReader;
导入java.io.UnsupportedEncodingException;
导入java.net.UnknownHostException;
导入java.util.ArrayList;
导入java.util.List;
导入org.apache.http.HttpEntity;
导入org.apache.http.HttpResponse;
导入org.apache.http.HttpStatus;
导入org.apache.http.NameValuePair;
导入org.apache.http.client.ClientProtocolException;
导入org.apache.http.client.HttpClient;
导入org.apache.http.client.entity.UrlEncodedFormEntity;
导入org.apache.http.client.methods.HttpPost;
导入org.apache.http.client.params.HttpClientParams;
导入org.apache.http.impl.client.DefaultHttpClient;
导入org.apache.http.message.BasicNameValuePair;
导入org.apache.http.params.BasicHttpParams;
导入android.app.Activity;
导入android.content.Intent;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.Menu;
导入android.widget.Toast;
公共类BalanceCheckerActivity扩展活动{
私有最终字符串登录\u URL=”https://someloginsite.com“;//用户名和密码
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u balance\u checker);
字符串用户名=getIntent().getExtras().getString(“用户名”);
字符串密码=getIntent().getExtras().getString(“密码”);
//构建post参数、键和值对
List accountInfo=new ArrayList(2);
accountInfo.add(新的BasicNameValuePair(“inputEnterpriseId”,用户名));
accountInfo.add(新的BasicNameValuePair(“密码”,password));
//创建HTTP客户端
HttpClient HttpClient=新的DefaultHttpClient();
//创建HTTP Post
HttpPost HttpPost=新的HttpPost(登录地址);
BasicHttpParams params=新的BasicHttpParams();
setParameter(“inputEnterpriseID”,用户名);
参数设置参数(“密码”,密码);
httpPost.setParams(params);
//对POST参数进行Url编码
试一试{
setEntity(新的UrlEncodedFormEntity(accountInfo));
}
捕获(不支持的编码异常e){
//将错误写入日志
e、 printStackTrace();
startActivity(新意图(this,AccountInputActivity.class));
}
HttpResponse响应=null;
InputStreamReader iSR=null;
字符串源=null;
//发出HTTP请求
试一试{
response=httpClient.execute(httpPost);
//将响应写入日志
Log.d(“Http响应:,Response.toString());
iSR=新的InputStreamReader(response.getEntity().getContent());
BufferedReader br=新的BufferedReader(iSR);
来源=”;
而((source=br.readLine())!=null)
{
source+=br.readLine();
}
}捕获(客户端协议例外e){
//将异常写入日志
e、 printStackTrace();
startActivity(新意图(this,AccountInputActivity.class));
}捕获(IOE异常){
//将异常写入日志
e、 printStackTrace();
startActivity(新意图(this,AccountInputActivity.class));
}
系统输出打印项次(来源);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(R.menu.activity\u balance\u checker,menu);
返回true;
}
}
在我看来,这基本上相当不错。我只看到一段明显错误的代码:
while((source = br.readLine()) != null)
{
source += br.readLine();
}
这有点乱,我不会试图解开它,而是重写它
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null)
sb.append(line);
String source = sb.toString();
此外,您不应该从onCreate()或甚至从UI线程内部执行网络I/O,因为它可能会阻塞很长时间,冻结整个UI,并可能导致“应用程序无响应”(ANR)崩溃。但是,对于一个简单的测试程序,您可以暂时不考虑这个问题。对于生产代码,您可以启动一个线程或使用AsyncTask()
无论如何,我们对为您构建和调试程序并不感兴趣。你试过这个代码吗?结果如何
最后一点注意:像这样的登录序列可能会以cookie的形式返回身份验证令牌。我忘记了如何从HttpResponse中提取cookie,但您会希望这样做,然后将收到的cookie作为该网站后续请求的一部分
原始答复: 我想你明白了