0

我正在使用 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 只是我创建的一个对象,用于保存有关响应的相关信息。

4

1 回答 1

0

这是因为我发送了相同的标头并且没有更改请求的“主机”标头,这导致 Apache 看起来很困惑。

于 2012-07-18T10:41:51.310 回答