【问题标题】:Why don't Android web requests automatically follow redirects? [duplicate]为什么 Android 网络请求不自动跟随重定向? [复制]
【发布时间】:2013-03-18 12:54:48
【问题描述】:

几周前我在 WebView 中遇到了一个问题,它没有像普通浏览器那样跟随重定向。我使用了许多 SO 答案中给出的以下建议:

String newUrl = response.getFirstHeader("Location").getValue();

但它只提供了 1 步重定向,但没有更多,这是它需要的。我通过反复监听重定向并手动完成每个步骤来解决它。

现在我正在使用以下代码:

HttpClient httpClient = MyApp.getHttpClient();
HttpPost httpPost = new HttpPost(con.getString(R.string.platform_url_getBalances));

List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
nameValuePairs.add(new BasicNameValuePair("sid", String.valueOf(sessionKey)));
ResponseHandler<String> responseHandler = new BasicResponseHandler();

httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

String response = null;

// Execute HTTP Post Request. Response body returned as a string
response = httpClient.execute(httpPost, responseHandler);

最近R.string.platform_url_getBalances 的端点发生了变化,但我们将 302 重定向到不同的 URL。它在浏览器和应用程序的 iPad 版本上运行良好,但对于 Android,我得到org.apache.http.client.HttpResponseException: Not Found

我觉得很奇怪,Android 在重定向方面如此痛苦。为什么它会有这样的行为,是否有合理的解决方法?

【问题讨论】:

  • 这并没有说明为什么会这样,而且那个 SO 问题没有一个公认的答案。您链接的博客文章还说“默认情况下 DefaultHttpClient 将自动处理重定向”,但它似乎没有这样做。
  • 第一个链接确实“说明为什么会这样”并且确实有一个公认的答案。
  • 没有注意到文字上的第一个链接。
  • 如果您愿意将此作为答案发布,我会接受,或者我会删除该问题,而不是让未回答的问题四处游荡。

标签: android redirect apache-httpclient-4.x


【解决方案1】:

实际上,the answer I linked to in my comment 适用于 HttpClient 4.1,据我所知,Android 版本较旧。

我的猜测是 Android 版本的 HttpClient 中的等效过程是这样的:

  • 创建DefaultRedirectHandler 的子类,根据您的应用覆盖isRedirectRequested()
  • 创建DefaultHttpClient 的子类并覆盖createRedirectHandler() 以返回您在上一步中创建的子类的实例
  • 无论您在哪里创建该实例,都可以使用 DefaultHttpClient 的子类替代 DefaultHttpClient 本身

【讨论】:

    猜你喜欢
    • 2012-08-25
    • 2016-08-30
    • 2017-01-24
    • 2015-12-09
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    相关资源
    最近更新 更多