簡體   English   中英

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

[英]Retrieve redirected URL with Java / HttpURLConnection

給定一個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'不會返回“最終” URL。
  • 我嘗試使用返回值'getHeaderField'調用我的代碼,直到響應代碼為2xx。
  • 但是在大多數其他情況下,響應代碼為3xx,“ getHeaderField”確實返回“最終” URL,如果我使用該URL調用代碼,則會得到一個空字符串。

您能否建議如何解決上述兩個問題,以獲取用於“最終” URL的“ 100%證明”代碼?

請忽略響應碼為4xx或5xx(或1xx / 2xx / 3xx以外的其他值)的情況。

謝謝

概念問題

0.)是否可以重用一個URLConnectionHttpURLConnection對象?

不,您不能重用此類對象。 您可以使用它一次獲取一個URL的內容。 您不能使用它來檢索另一個URL,也不能兩次獲取內容(在網絡級別上說)。

如果要獲取另一個URL或第二次獲取URL,則必須再次調用URL類的openConnection()方法來實例化新的連接對象。

1.)何時實際連接URLConnection?

方法名稱openConnection()具有誤導性。 它僅實例化連接對象。 它在網絡級別不執行任何操作。

在網絡級別上的交互從此行開始,它隱式地連接了連接(=打開引擎蓋下的TCP套接字,並發送和接收數據):

int responseType = con.getResponseCode()/100;

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

2.) setInstanceFollowRedirects如何工作?

setInstanceFollowRedirects(true)導致一次又一次“隱藏”獲取URL,直到出現非重定向響應為止。 通過調用getResponseCode()返回非重定向響應的響應代碼。

更新
是的,如果您不想自己擔心重定向,則可以編寫簡單的代碼。 您可以簡單地打開電源以跟隨重定向,然后您可以讀取重定向到的位置的最終響應,就好像沒有發生重定向一樣。

在評估響應代碼時,我會更加謹慎。 並非每一個3xx代碼都會自動重定向。 例如,代碼304僅代表“未修改”。

這里查看原始定義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM