2013-02-15 26 views
4

我的代碼(下面)試圖獲取從重定向的服務器返回的最終URL。只要URL具有http方案,它就可以正常工作。當我想用不同的方案返回一個URL時,我的問題就出現了。最終,我希望在某些情況下返回市場:// url或其他應用程序啓動計劃,因爲這是針對Android的,我希望啓動Intents。所以這就讓我儘可能檢索最終的http url,但是當最終的url是market時//它會拋出異常(java.lang.IllegalStateException:Scheme'market'未註冊),然後getURI沒有提供那個,它會提供之前的任何東西。使用非常規方案獲取重定向請求的最終URL

DefaultHttpClient client = new DefaultHttpClient(); 
    HttpContext httpContext = new BasicHttpContext(); 
    HttpGet httpGet = new HttpGet(mInitialUrl); 

    try { 
     client.execute(httpGet, httpContext); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } 

    // Parse out the final uri. 
    HttpHost currentHost = (HttpHost) httpContext.getAttribute(ExecutionContext.HTTP_TARGET_HOST); 
    HttpUriRequest req = (HttpUriRequest) httpContext.getAttribute(ExecutionContext.HTTP_REQUEST); 

    return (req.getURI().isAbsolute()) ? req.getURI().toString() : (currentHost.toURI() + req.getURI()); 

現在,我可以只註冊市場://作爲一個方案,但我不想硬編碼事先什麼有效的方案是,我只是希望它接受他們,並返回他們爲所欲爲是。

任何想法?也許我甚至沒有采取正確的做法。 (在這種情況下,更改服務器行爲不是一種選擇...我必須處理重定向。)

我希望有人能告訴我如何讓HttpClient忽略該方案,或者至少保留它嘗試訪問的最終URI。

+0

「URLConnection」的快速測試適用於我。你打算使用它嗎? – BalusC 2013-02-15 00:56:19

+0

哦,是的。我會給你一個鏡頭。 – Turnsole 2013-02-15 17:08:51

+0

好的。我發佈了一個答案。 – BalusC 2013-02-15 17:26:01

回答

2

使用HttpURLConnection爲我工作。當目標資源不是HTTP資源時,以下重定向將毫無例外地停止。

HttpURLConnection connection = (HttpURLConnection) new URL(mInitialUrl).openConnection(); 
connection.setInstanceFollowRedirects(true); 
String location = connection.getHeaderField("location"); 
+0

connection.getHeaderField(「location」)對我而言始終爲空。我嘗試插入connection.connect(),但沒有運氣。 – Turnsole 2013-02-16 00:02:00

+0

有趣的事情......如果我將setInstanceFollowRedirects更改爲false,則它會提供「location」的重定向值。顯然,該位置是重定向標題的一部分,如果它自動遵循重定向,它將不會得到它? (我的線索在這裏:http://stackoverflow.com/questions/3786161/cant-get-response-header-location-using-javas-urlconnection。) – Turnsole 2013-02-27 20:43:40

+0

存在多個重定向的問題。我可以得到第一個重定向,但由於它沒有跟隨到最後,我無法得到最後一個。 – Turnsole 2013-02-27 20:54:53