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         }
原文地址:https://www.cnblogs.com/taofudemo/p/4969672.html