我编写了一个 Android 应用程序,它应该使用 HTTP GET(有时是 POST)请求“连接”到(私人)论坛。基本思路是这样的:
用户提交凭据的登录页面。登录是通过向论坛的登录页面执行 HTTP POST(也尝试 GET,结果相同)来执行的,其用户名和密码作为参数。该请求应返回一些我存储在
BasicCookieStore
.他们想访问的论坛的每个页面都是使用 HTTP GET 检索的。我解析我获得的 HTML 源代码并仅向它们显示相关信息。为了对用户进行身份验证
BasicCookieStore
,我用于登录(步骤 1)的相同设置为HttpClient
.
这种方法在我的测试过程中一直有效,并且也适用于我的 beta 测试人员。现在我发布了该应用程序,很明显许多用户都遇到了问题,尤其是在移动连接上(Wifi 似乎没问题)。
通过记录在所有 HTTP GET 请求中返回的 HTML 源,我强烈怀疑实际登录工作正常,但不知何故,cookie 没有被返回或存储或其他方向。问题是他们将收到的第一页的 HTML 源代码应该是论坛列表。然而,对于有问题的用户,他们会得到一个页面,该页面基本上显示为“您必须启用 Javascript 才能查看此页面”。
奇怪的是,我在测试时没有收到该页面,我的许多用户也没有。更糟糕的是:一些用户现在报告说它在几天或几周内都可以正常工作,现在已经停止工作。其他人则完全相反:几天不工作,现在突然工作。一位用户报告说他在希腊呆了 2 周,在那里它工作得很好,然后他回到德国,它又停止了工作。这里似乎有一个随机组件在起作用。
我尝试了各种方法,主要是我执行 HTTP GET 请求的方式。我开始使用 normal DefaultHttpClient
,具有各种设置,例如:
HttpClient httpClient = new DefaultHttpClient();
// Define parameters
HttpParams httpParams = httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(httpParams, TIMEOUT);
HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT);
HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1);
// Set cookiestore (getCookieStore returns the same cookiestore)
HttpContext localContext = new BasicHttpContext();
localContext.setAttribute(ClientContext.COOKIE_STORE, getCookieStore());
HttpGet http = new HttpGet(url);
http.addHeader("Accept", ACCEPT_STRING);
http.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
// Execute
HttpResponse response = httpClient.execute(http, localContext);
//... Process result (omitted)
现在我已经改用 AndroidHttpClient 了,其余代码基本没有变化,似乎得到了相同的结果。
我也尝试过使用 AsyncHttpClient 库,它的工作方式完全不同,但结果还是一样。我也尝试过使用它的 PersistentCookieStore,你猜对了——结果相同。
在这一点上我一无所知。我看错方向了吗?网站会为某些用户而不是所有用户响应“您需要启用 Javascript”这一事实似乎表明 cookie 存在问题。我不知道网站如何确定是否启用了 javascript,但肯定有 HTTP GET 请求没有 javascript 在起作用。那么为什么我(和许多其他用户)可以毫无问题地访问该页面,而其他人却收到“无 javascript”消息?我能想到的唯一原因是饼干,但我不知道问题到底是什么。
任何帮助将非常感激!