0

我编写了一个 Android 应用程序,它应该使用 HTTP GET(有时是 POST)请求“连接”到(私人)论坛。基本思路是这样的:

  1. 用户提交凭据的登录页面。登录是通过向论坛的登录页面执行 HTTP POST(也尝试 GET,结果相同)来执行的,其用户名和密码作为参数。该请求应返回一些我存储在BasicCookieStore.

  2. 他们想访问的论坛的每个页面都是使用 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”消息?我能想到的唯一原因是饼干,但我不知道问题到底是什么。

任何帮助将非常感激!

4

1 回答 1

0

我怀疑问题出在cookie上。更有可能是网络配置问题。

例如,您的用户可能已通过强制门户页面连接到 wifi 热点(该页面使用 javascript 让您在使用热点之前登录)。在这种情况下,他们应该首先打开浏览器,尝试浏览(例如)http://google.com,获得重定向,登录,然后启动您的应用程序。

或者,您的用户可能正在通过代理进行连接。世界各地的许多移动运营商都会代理其用户的 HTTP 连接,有时会对内容做出可怕的事情。切换到 HTTPS 可能会有所帮助。

于 2013-06-25T14:04:25.380 回答