0

使用带有 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?

4

2 回答 2

5

我建议使用Android 异步 HTTP 客户端

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

因此,要将它与您当前的课程一起使用,您可以简单地在您的 HttpSupport 类中进行更改

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

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

于 2012-06-11T21:41:01.940 回答
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?

于 2012-06-11T21:29:09.207 回答