从curl --dump-header [file] [URL]
文件看起来像:
HTTP/1.1 301 Moved Permanently
Age: 0
Cache-Control: no-cache, must-revalidate, post-check=0, pre-check=0
Content-Type: text/html
Date: Tue, 13 Aug 2013 13:00:12 GMT
ETag: "1376398812"
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Tue, 13 Aug 2013 13:00:12 GMT
Location: http://www.seas.harvard.edu/computer-science
Server: nginx
Vary: Accept-Encoding
Via: 1.1 varnish
X-AH-Environment: prod
X-Cache: MISS
X-Drupal-Cache: MISS
X-Redirect-ID: 44
X-Varnish: 2704315535
transfer-encoding: chunked
Connection: keep-alive
如您所见,这是从服务器提供的 301 永久重定向。
要获取数据:
您可以使用 HttpURLConnection 进行连接,但在连接之前,请调用myConn.setInstanceFollowRedirects(true)
. 遵循重定向,您可以获取输出流并读取它。
要获取 URL 本身:
您可以使用HttpURLConnection
连接,但在连接之前,调用myConn.setInstanceFollowRedirects(false)
不遵循重定向。这会将实际的 URL 保存在正确的位置。
这里的诀窍是,出于某种奇怪的原因,除非您将其解析为日期,否则HttpURLConnection 不允许按名称检索标头。
因此,您将需要迭代一个整数,getHeaderFieldKey
在建立连接后调用并检查它是否等于Location
,如果是,则getHeaderField
使用相同的整数来获取位置。烦人,我知道。但是位置不是日期,这是 JRE 的疏忽。