我正在使用 HttpURLConnection 与后端服务器进行通信,并且我应该在 doInBackground 方法中的异步任务中这样做。
现在我需要能够遵循 302 重定向,但我遇到了一些问题。问题是新位置通常位于另一台主机上,但是在执行重定向请求时,它似乎没有将 URL 更改为新主机,因此我收到 404 错误,说明指定的路径不存在。
现在我知道我可以设置 HtppURLConnection.setFollowRedirect 但我需要对重定向有更多的控制权,所以不应该盲目地遵循它们。重定向行为应该由调用 asynctask 的对象控制(当创建 asynctask 对象时,您将创建它的对象传递给名为 _callback 的参数)。
这是我当前的代码:
protected HttpResponse doInBackground(String... req) {
HttpURLConnection urlConnection = null;
try {
urlConnection = (HttpURLConnection) this._url.openConnection();
urlConnection.setConnectTimeout( (int) this._timeout*1000);
String body = req[0];
// set headers / write information to output stream if request is post
// create the response object
HttpResponse responseObject = null;
try
{
// get status, contenttype, charset...
InputStream in = null;
if (urlConnection.getResponseCode() != -1 && urlConnection.getResponseCode() < 300)
{
in = new BufferedInputStream(urlConnection.getInputStream(), 8192);
}
else
{
in = new BufferedInputStream(urlConnection.getErrorStream(), 8192);
}
responseObject = new HttpResponse(in, status, contentType, charset);
// if redirect
if (status == 302 && this._callback.onRedirect(responseObject) == true)
{
// recall
String url = urlConnection.getHeaderField("location");
Log.v("Async Task", "Redirect location: " + url);
this._url = null;
this._url = new URL(url);
urlConnection.disconnect();
urlConnection = null;
responseObject = this.doInBackground(req);
}
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
// return the response
return responseObject;
}
// catch some other exceptions
finally
{
if (urlConnection != null)
{
urlConnection.disconnect();
} }
}
如前所述,问题在于重定向请求似乎改变了 URL 的路径,而不是主机。URL 对象本身似乎包含正确的信息,所以我不知道为什么会这样。(我收到 HTML 作为响应,这是一个 404 错误页面,其中包含旧服务器的服务器名称)
谢谢你的帮助!
注意: HttpResponse 只是我创建的一个对象,用于保存有关响应的相关信息。