使用Java / HttpURLConnection检索重定向的URL

时间:2013-12-27 18:25:54

标签: java httpurlconnection http-redirect url-redirection

给定一个URL(String ref),我试图按如下方式检索重定向的URL:

        HttpURLConnection con = (HttpURLConnection)new URL(ref).openConnection();
        con.setInstanceFollowRedirects(false);
        con.setRequestProperty("User-Agent","");
        int responseType = con.getResponseCode()/100;
        while (responseType == 1)
        {
            Thread.sleep(10);
            responseType = con.getResponseCode()/100;
        }
        if (responseType == 3)
            return con.getHeaderField("Location");
        return con.getURL().toString();

我遇到了几个(概念和技术)问题:

概念问题:

  • 它适用于大多数情况,但我不太了解如何。
  • ' con'的所有方法。在打开连接之后调用实例(当' con'实例化时)。
  • 那么它们如何影响实际结果?
  • 如何调用' setInstanceFollowRedirects'影响' getHeaderField'?
  • 的返回值
  • 是否有任何要求调用' getResponseCode'一遍又一遍,直到返回的值不是1xx?
  • 底线,我的一般问题是:每次调用其中一个方法时,是否有另一个通过连接发送的请求/响应?

技术问题:

  • 有时响应代码是3xx,但是' getHeaderField'没有返回" final" URL。
  • 我尝试使用' getHeaderField'的返回值调用我的代码。直到响应代码为2xx。
  • 但在大多数其他情况下,响应代码是3xx,' getHeaderField'是否会返回" final" URL,如果我使用此URL调用我的代码,那么我会得到一个空字符串。

您能否告知如何处理上述两个问题,以便获得" 100%证明"用于检索" final"的代码URL?

请忽略响应代码​​为4xx或5xx的情况(或其他除1xx / 2xx / 3xx以外的任何其他情况)。

由于

2 个答案:

答案 0 :(得分:2)

概念性问题

0。)可以重复使用一个URLConnectionHttpURLConnection个对象吗?

不,你不能重复使用这样的对象。您可以使用它只获取一个URL的内容。您不能使用它来检索另一个URL,也不能使用两次获取内容(在网络级别上说话)。

如果您想要再次获取其他URL或获取URL,则必须再次调用openConnection()类的URL方法来实例化新的连接对象。

1。)URLConnection何时实际连接?

方法名称openConnection()具有误导性。它只会实现连接对象。它在网络级别上没有任何作用。

网络级别的交互从此行开始,它隐式连接连接(=打开引擎盖下的TCP套接字并发送和接收数据):

int responseType = con.getResponseCode()/100;

或者,您可以使用HttpURLConnection.connect()显式连接连接。

2.。setInstanceFollowRedirects如何运作?

setInstanceFollowRedirects(true)会一次又一次地“引导”网址,直到出现非重定向响应。您致电getResponseCode()时会返回非重定向响应的响应代码。

<强>更新
是的,如果您不想自己打扰重定向,这可以编写简单的代码。您只需打开以关注重定向,然后您就可以阅读重定向到的位置的最终响应,就好像没有重定向一样。

答案 1 :(得分:0)

在评估响应代码时我会更加小心。并非每个3xx代码都自动成为一种重定向。例如,代码304仅代表“未修改”。

查看原始定义here