给定一个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();
我遇到了几个(概念和技术)问题:
概念问题:
技术问题:
您能否告知如何处理上述两个问题,以便获得" 100%证明"用于检索" final"的代码URL?
请忽略响应代码为4xx或5xx的情况(或其他除1xx / 2xx / 3xx以外的任何其他情况)。
由于
答案 0 :(得分:2)
概念性问题:
0。)可以重复使用一个URLConnection
或HttpURLConnection
个对象吗?
不,你不能重复使用这样的对象。您可以使用它只获取一个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。