【问题标题】:AndroidHttpClient and CookiesAndroidHttpClient 和 Cookie
【发布时间】:2012-06-12 23:36:30
【问题描述】:

使用带有 cookie 的 AndroidHttpClient 会给我混合 200 ok 和 403 禁止响应。我不确定我做错了什么。

我使用 AndroidHttpClient 的方式如下:

我有几个后台线程类,每个都执行以下操作:

HttpGet get...
HttpClient client = AndroidHttpClient.newInstance("Android");
HttpContext http_context = HttpSupport.getHttpContextInstance(); 
CookieStore cookie_store = HttpSupport.getCookieStoreInstance();
http_context.setAttribute(ClientContext.COOKIE_STORE, cookie_store);
client.execute(

HttpSupport 是一个有两个静态字段的类;一个 CookieStore 和一个 HttpContext:

public class HttpSupport {

private static HttpContext _context;
private static CookieStore _cookieStore;

public static synchronized HttpContext getHttpContextInstance() {
    if (_context == null) {
        _context = new BasicHttpContext();
    }
    return _context;
}

public static synchronized CookieStore getCookieStoreInstance() {
    if (_cookieStore == null) {
        _cookieStore = new BasicCookieStore();
    }
    return _cookieStore;
}

}

可以在应用程序中拥有多个 AndroidHttpClient 实例吗?我是否正确存储了 cookie?

【问题讨论】:

  • 您是否在整个代码中使用了不同的客户端实例?您确定您的服务器没有过期导致问题的会话之一吗?
  • 我在整个代码中使用了不同的客户端实例。我改为使用单例 DefaultHttpClient。
  • 你最后做了什么?

标签: android cookies httpclient httpcontext


【解决方案1】:

HttpClient 会自动存储我找到的 cookie,您真的应该在异步任务中执行所有这些操作(对于 Android 3.0> 要求)。

200 响应是当所有内容都已通过正确发送并且您想要的文件对您可用时,这不是问题。

403 错误很明显,这个服务器是否需要某种类型的登录才能获取文件或网页?这就是您应该调查的内容,确定如何登录的一种方法是使用谷歌浏览器之类的东西,右键单击网页,检查元素,然后观察网络文件通过,登录,观察发布请求.了解网站的运作方式。

在这里查看异步任务:HTTP POST request ANDROID 4 (working in 2.3)?

我相信您可以拥有多个 HttpClient 实例,但要使用相同的 cookie,您应该为所有连接的东西使用一个

例如:

你应该有一个 HttpClient 来登录,然后使用 get 请求一个页面,做你需要做的事情等等。


抱歉,您使用的是 AndriodHttpClient 而不是 HttpClient,AndroidHttpClient 默认不存储 cookie,所以是的,您有什么理由使用 AndroidHttpClient 而不是 HttpClient?

【讨论】:

  • 我认为要使用 HttpClient 您需要导入 Apache 库。我正在使用多个客户端,因为我有多个线程发出请求。
  • 我不需要导入 Apache 库?您不能对客户端进行静态引用并从所有线程中引用客户端吗?
  • 我现在正在这样做,但仍然得到 403 和 200 的混合:/
  • 我使用的是单例,而不是静态客户端。
【解决方案2】:

我会推荐使用Android Asynchronous HTTP Client

它实现了自己的持久性 cookie 存储(PersistentCookieStore),非常易于使用。事实上,如果您不想使用该库的异步功能,您可以将其用于它提供的 Persistent Cookie Store。但是它的异步功能非常值得。

因此,要将它与您当前的类一起使用,您只需在具有

的 HttpSupport 类中进行更改
public static synchronized CookieStore getCookieStoreInstance(Context context) {
    if (_cookieStore == null) {
        _cookieStore = new PersistentCookieStore(context);
    }
    return _cookieStore;
}

请注意,您必须将上下文添加到方法中,因为 PersistentCookieStore 需要它才能工作。

【讨论】:

  • 请给出拒绝投票的理由。我正在使用带有提到的 cookie 存储的 AndroidHttpClient,并发现该库中的持久性 cookie 存储运行良好。另一个明显的解决方案是不使用 android httpclient,而是使用 DefaultHttpClient,如此处所述stackoverflow.com/questions/5410823/…
  • 本来是要投赞成票的-.-我想改变它,但它不会让我。进行某种类型的编辑,以便我可以?谢谢:)
  • 没关系。虽然不是一个很好的答案,但我只是觉得它不值得被否决。 2分虽然伤不起。我认为 OP 确实应该尝试该库(对于 cookie 存储和使用异步 http 调用来简化他的应用程序)。看起来它完全支持 http auth。
  • 我不会推荐 android-async-http。它对我来说很好用了一段时间,但今天突然开始抛出随机故障,比如忽略 HTTP 错误并在远程服务器无法访问时进入无限循环。
  • 我实际上不使用它,但我确实使用它的 cookie 存储.. 可能有点矫枉过正,但效果很好。
猜你喜欢
  • 2011-07-05
  • 1970-01-01
  • 2016-03-27
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
  • 2014-10-31
  • 1970-01-01
相关资源
最近更新 更多