转载

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         }
正文到此结束
Loading...