我写了一个Android应用程序,应该使用HTTP GET(有时是POST)请求“连接”到(私人)论坛。基本理念是这样的:
用户提交凭据的登录页面。登录是通过HTTP论坛(尝试GET,同样的结果)到论坛的登录页面进行的,其用户名和密码作为参数。该请求应返回我存储在BasicCookieStore
中的一些cookie。
使用HTTP GET检索他们想要访问的论坛的每个页面。我解析了我获得的HTML源代码并仅显示相关信息。为了对用户进行身份验证,我用于登录的相同BasicCookieStore
(步骤1)被设置为HttpClient
的cookiestore。
此方法在我的测试期间一直在运行,并且也为我的beta测试人员工作过。现在我发布了应用程序,很明显许多用户遇到了问题,特别是在移动连接上(Wifi似乎没问题)。
通过记录在所有HTTP GET请求中返回的HTML源代码,我强烈怀疑实际登录工作正常,但不知何故,cookie不会被返回或存储或者在那个方向上。问题是他们将收到的第一页的HTML源应该是论坛列表。但是,对于有问题的用户,他们会获得一个基本上读取“您必须启用Javascript才能查看此页面”的页面。
奇怪的是,我在测试时没有收到该页面,我的许多用户也没有收到。更糟糕的是:一些用户现在报告它可以在几天或几周内正常工作,现在已经停止工作了。其他人恰恰相反:没有工作几天,现在突然工作。一位用户报告说他在希腊待了2个星期,在那里工作完美无缺,然后又回到了德国,并再次停止工作。 这里似乎有一个随机的组件。
我尝试过各种各样的事情,主要是我做HTTP GET请求的方式。我开始使用普通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”消息?我能想到的唯一原因是cookies,但我不知道究竟是什么问题。
非常感谢任何帮助!
答案 0 :(得分:0)
我怀疑问题是饼干。更可能是网络配置问题。
例如,您的用户可能已经连接到带有强制门户网站页面的wifi热点(使用javascript可以让您在使用热点之前登录)。在这种情况下,他们应首先打开浏览器,尝试浏览(例如)http://google.com,重定向,登录,然后启动您的应用。
或者,您的用户可能正在通过代理进行连接。世界各地的许多移动运营商都会代理其用户的HTTP连接,有时会对内容做出可怕的事情。切换到HTTPS可能会有所帮助。