標籤:
最近項目中需要用到重新導向下載,所以找了很多的方法都不合適。因為下載的連結並非單純的地址,而是需要多次轉寄的,
在下載的時候用的是URL來開啟資料流。但是多次測試並不能對多次跳轉的連結開啟請求。對於302http狀態來說。只有最終的地址才是200才是我們想要的
於是就需要解析該多次跳轉的連結。
這裡我用到了AndroidHttpClient這個類,百度一下,這個類時sdk2.3後就有了,AndroidHttpClient沒有公開的建構函式,只能通過靜態方法newInstance()方法來獲得AndroidHttpClient對象。
AndroidHttpClient對於DefaultHttpClient做了一些改進,使其更使用用於Android項目:
1.關掉到期檢查,自串連可以打破所有的時間限制。
2.可以設定ConnectionTimeOut(連線逾時)和SoTimeout(讀取資料逾時)。
3.關掉重新導向。
4.使用一個Session緩衝用於SSL Sockets。
5.如果伺服器支援,使用gzip壓縮方式用於在服務端和用戶端傳遞的資料。
6.預設情況下不保留Cookie.
AndroidHttpClient不能在主線程中execute,會拋出異常。AndroidHttpClient通過靜態方法newInstance 獲得執行個體,參數是代理,不用代理的話填“”。DefaultHttpClient預設是啟用Cookie的,AndroidHttpClient預設不啟 用Cookie,要使用的話每次execute時要加一個HttpContext參數,並且添加CookieStore。用完後別忘了close不然不能 建立新執行個體。
以下就是代碼:
1 /** 2 * @return 3 * 該方法用於判斷最終的連結得出 4 */ 5 public String getRedirectUrl(String testUrl){ 6 7 AndroidHttpClient client = AndroidHttpClient.newInstance("Android"); 8 HttpGet httpGet = new HttpGet(testUrl); 9 try {10 HttpResponse hr = client.execute(httpGet);11 int code = hr.getStatusLine().getStatusCode();12 Log.i("ABC", "code:"+code);13 if(code != HttpStatus.SC_OK){14 Header[] hander = hr.getHeaders("Location");15 if(hander != null && hander.length > 0){16 String redictUrl = hander[hander.length-1].getValue();17 //多次判定重新導向18 return getRedirectUrl(redictUrl);19 }20 }21 } catch (IOException e) {22 e.printStackTrace();23 } finally{24 if(client != null){25 client.close();26 }27 }28 return testUrl;29 }
android 處理302地址