如何让Android HttpURLConnection处理重定向

如何让Android HttpURLConnection处理重定向,android,redirect,Android,Redirect,我正在制作一个应用程序,它基本上是从我定义的URL下载一个图像,然后保存到用户的设备上。我是这样做的: URL url = new URL("http://speedtest.clotheslinedigital.com"); HttpURLConnection c = (HttpURLConnection) url.openConnection(); c.setRequestMethod("GET"); c.connect(); 然后在检查存储是否正常工作并创建一个空白文件保存到设备

我正在制作一个应用程序,它基本上是从我定义的URL下载一个图像,然后保存到用户的设备上。我是这样做的:

 URL url = new URL("http://speedtest.clotheslinedigital.com");
 HttpURLConnection c = (HttpURLConnection) url.openConnection();
 c.setRequestMethod("GET");
 c.connect();
然后在检查存储是否正常工作并创建一个空白文件保存到设备上之后,我使用文件输出流和输入流将文件下载到设备上

出于测试目的,我刚刚使用了一个Dropbox下载链接到一个图像,它工作得非常好。但是,在生产中,我希望使用DNS子域重定向来链接到文件,而不是在我的应用程序中使用硬编码链接,这样,如果我更改应用程序需要下载的文件的路径,我就不必更新应用程序

为了进行测试,我通过Godaddy DNS设置了301重定向,重定向到我使用硬编码进行测试的Dropbox链接。当我在浏览器上输入子域时,子域工作得很好,但是当我将子域URL硬插入我的应用程序时,没有下载任何内容,只留下一个空白文件(请求用于存储下载的文件后生成的文件)

我尝试使用setFollowRedirects()并将其设置为true,我认为这是默认设置,但我还是尝试了,但仍然失败

我想问题可能是HttpURLConnection无法处理来自服务器的301响应代码,但我查看了Dropbox链接的标题,它在下载文件之前多次重定向应用程序,没有任何问题


关于如何解决这个问题有什么想法吗?

经过进一步的研究,似乎我必须手动处理代码中的重定向。我基本上是通过监听连接请求的响应代码来实现的。如果重定向是301或302,我必须从报头抓取位置字段,并通过连接将其提供

这是我的代码:

boolean isRedirect;
do {
    if (c.getResponseCode() == HttpURLConnection.HTTP_MOVED_PERM || c.getResponseCode() == HttpURLConnection.HTTP_MOVED_TEMP) {
        isRedirect = true;
        String newURL = c.getHeaderField("Location");
        c = (HttpURLConnection) new URL(newURL).openConnection();
    } else {
        isRedirect = false;
    }
} while (isRedirect);

没有必要将整个内容封装在一种循环中,但这样做将允许代码正常工作,即使您需要处理多个重定向。

经过进一步研究,似乎我必须在代码中手动处理重定向。我基本上是通过监听连接请求的响应代码来实现的。如果重定向是301或302,我必须从报头抓取位置字段,并通过连接将其提供

这是我的代码:

boolean isRedirect;
do {
    if (c.getResponseCode() == HttpURLConnection.HTTP_MOVED_PERM || c.getResponseCode() == HttpURLConnection.HTTP_MOVED_TEMP) {
        isRedirect = true;
        String newURL = c.getHeaderField("Location");
        c = (HttpURLConnection) new URL(newURL).openConnection();
    } else {
        isRedirect = false;
    }
} while (isRedirect);
没有必要将整个过程封装在一种循环中,但是这样做将允许代码正常工作,即使您需要处理多个重定向