为什么Android网络请求不会自动跟踪重定向?

时间:2013-03-18 12:54:49

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

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

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

但它只提供了一步重定向,但不是更多,它需要它。我通过反复监听重定向并手动完成每一步来解决这个问题。

现在我使用以下代码:

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重定向到另一个网址。它在浏览器和iPad版本的应用程序中运行良好,但对于Android,我得到org.apache.http.client.HttpResponseException: Not Found

我觉得非常奇怪的是Android在重定向时非常痛苦。为什么它会像这样,是否有合理的方法呢?

1 个答案:

答案 0 :(得分:0)

实际上,the answer I linked to in my comment适用于HttpClient 4.1,我可以说,而且Android的版本较旧。

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

  • 创建DefaultRedirectHandler的子类,根据您的应用覆盖isRedirectRequested()
  • 创建DefaultHttpClient的子类并覆盖createRedirectHandler()以返回您在上一步中创建的子类的实例
  • 在创建该实例的任何地方,使用DefaultHttpClient的子类替代DefaultHttpClient