【发布时间】:2014-01-15 08:22:06
【问题描述】:
给定一个 URL(字符串引用),我正在尝试检索重定向的 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'的返回值?
- 在返回值不是 1xx 之前一遍又一遍地调用“getResponseCode”有什么意义吗?
- 归根结底,我的一般问题是:每次调用这些方法之一时,是否还会通过连接发送另一个请求/响应?
技术问题:
- 有时响应代码是 3xx,但“getHeaderField”不返回“最终”网址。
- 我尝试使用返回值“getHeaderField”调用我的代码,直到响应代码为 2xx。
- 但在大多数其他响应代码为 3xx 的情况下,“getHeaderField”确实会返回“最终”URL,如果我使用此 URL 调用我的代码,则会得到一个空字符串。
您能否建议如何解决上述两个问题,以便获得用于检索“最终”网址的“100% 证明”代码?
请忽略响应代码为 4xx 或 5xx(或除 1xx / 2xx / 3xx 之外的任何其他内容)的情况。
谢谢
【问题讨论】:
-
您的异常处理是什么样的?也许代码悄悄地忽略了一个异常,它可以告诉你更多关于问题的可能原因。也请发布 try..catch 或 throws 部分。
-
上面提到的都是指没有抛出异常的情况。整个代码用 try/catch 正确封装,任何异常都返回 ""。但我对解决这个问题范围内的异常不感兴趣,因为(正如我所说)所描述的问题发生在“正常执行路径”下。
标签: java httpurlconnection http-redirect url-redirection