在Android上使用HttpPost时出错

时间:2012-12-04 01:45:37

标签: android http-post

我正在尝试将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;
    }
    }

1 个答案:

答案 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;
    }
}