我正在尝试将Android中的文本输入网站,我读到httppost是一个不错的选择。我下载了HttpClient 4.2.2(GA)tar.gz,解压缩它们,并将7个jars复制到Eclipse中我的android项目的lib文件夹中。我很确定我收到了所有的罐子,因为它们与网站上列出的相匹配。
然后我继续复制并粘贴顶级教程:http://hc.apache.org/httpcomponents-client-ga/quickstart.html
我导入了所有内容,并留下了这个错误:
EntityUtils.consume(entity1); //X
} finally {
httpGet.releaseConnection(); //X
这部分代码位于教程的两个位置,两者都发生错误。 Eclipse说第一行:
“EntityUtils类型的方法消耗(HttpEntity)未定义。”
第二行:
“对于HttpGet类型,方法releaseConnection()未定义。”
我很确定我下载了每个罐子,正确运输它们并导入了所有东西。是什么造成错误?感谢。
这是我现在拥有的。爱德华,我使用了你方法中的一些代码,但只是将它们放入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;
}
}
答案 0 :(得分:2)
这对我来说看起来很不错。我只看到一段明显错误的代码:
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包含在对该网站的任何后续请求中。
原始答案:
我认为你已经把自己搞得一团糟了。 Apache http客户端软件包内置于Android中,因此无需从apache下载任何jar文件。
我不熟悉EntityUtils,但不管它是什么,如果你能避免使用它,我会这样做。尽可能坚持使用捆绑的API;您添加到应用程序中的每个第三方或实用程序库都会增加膨胀,而在移动设备上,您希望尽可能保持应用程序的轻量级。至于未找到的实际“consume()
”方法,这可能是文档中的错误。它们可能意味着consumeContent()
。
releaseConnection()
调用可能只是持久连接所必需的。这是相对先进的用法;我甚至不在自己的代码中执行持久连接或托管连接。
您没有提供足够的信息让我们知道您正在尝试做什么,但我会尝试给您一个相当通用的答案。
通过http协议将数据传输到服务器有很多种方法,但在绝大多数情况下,您希望通过HttpPost传输表单编码数据。
程序是:
DefaultHttpClient
HttpPost
请求
setHeader()
或addHeader()
。HttpEntity
client.execute()
HttpResponse
;检查状态代码。response.getEntity()
有许多HttpEntity
类,它们以自己的方式收集数据并将其传输到服务器。假设您正在传输表单编码数据,那么UrlEncodedFormEntity
就是您想要的数据。该实体获取NameValuePair
个对象的列表,它为表单编码数据正确格式化并传输它。
这是我为此写的一些代码;这些只是代码片段,所以我会留给你将它们合并到你的应用程序中并自己调试它们。
/**
* POST the given url, providing the given list of NameValuePairs
* @param url destination url
* @param data data, as a list of name/value pairs
*/
public HttpResponse post(String url, List<NameValuePair> data) {
HttpPost req = new HttpPost(url);
UrlEncodedFormEntity e;
try {
e = new UrlEncodedFormEntity(data, "UTF-8");
} catch (UnsupportedEncodingException e1) {
Log.e(TAG, "Unknown exception: " + e1);
return null; // Or throw an exception, it's up to you
}
return post(req, e);
}
/**
* Post an arbitrary entity.
* @param req HttpPost
* @param data Any HttpEntity subclass
* @return HttpResponse from server
*/
public HttpResponse post(HttpPost req, HttpEntity data) {
try {
HttpClient client = new DefaultHttpClient();
req.setEntity(data);
HttpResponse resp = client.execute(req);
int status = resp.getStatusLine().getStatusCode();
if (status != HttpStatus.SC_OK) {
Log.w(TAG,
"http error: " + resp.getStatusLine().getReasonPhrase());
return null; // Or throw an exception, it's up to you
}
return resp;
} catch (ClientProtocolException e) {
Log.e(TAG, "Protocol exception: " + e);
return null;
} catch (UnknownHostException e) {
return null;
} catch (IOException e) {
Log.e(TAG, "IO exception: " + e);
return null;
} catch (Exception e) {
// Catch-all
Log.e(TAG, "Unknown exception: " + e);
return null;
}
}