android 处理302地址
最近项目中需要用到重定向下载,所以找了很多的方法都不合适。因为下载的链接并非单纯的地址,而是需要多次转发的,
在下载的时候用的是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 }