retrofit2 获取响应头信息

旧城等待, 2022-05-15 13:48 380阅读 0赞

前言
最近几天晚上时候,一直在修改自己前一段时间写的下载工具。想着把它变成开源库造福大家。原本,以为是很简单的事。结果在下载文件格式哪里,博主陡然发现!
以前自己用的时候下载文件格式自己是知道的。所以,命名时候也就one.apk ,two.jpeg。这在个人使用的时候 完全不是问题。但如果变成开源库,这个就很影响逼格了!!!。开源库已经写好!!!Android下载库

确定下载格式

  1. 解析下载链接,如果包含 .apk 之类的 ,就将 “/” 到格式之间的取下来,作为文件名 包含格式。
    例如下面这个:就应该截取为 201809281641cj0928.apk
    在这里插入图片描述
  2. 但是好多下载链接 ,是没有 .文件格式 的。这时候 ,我们可以获取响应头里面的 “Content-Disposition” 它里面有一个 filename 属性,我们这时候 把filename的值当做文件名就行了。 但是,好多时候后台 如果 不返回这东西怎么办?
  3. 我们还可以根据 Content-Type来确定文件格式,就是不太准确。 Content-Type: application/vnd.android.package-archive。因为,有时候 后面这个值对应好几个文件格式,。。。。

上面都是题外话,这里是本文重点

获取response.header 响应头

这个就是本文的重点了。博主用的是retrofit2 ,而retrofit2 网络活动还是调用了okhttp3 。
所以,获取响应头的方式有两种:

  1. 我们可以给okhttp添加拦截器来获取response ,这样就可以取到响应头了。这个需要我们在创建OkHttpClient OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(3, TimeUnit.SECONDS).addInterceptor(new DownLoadInterceptor(downLoadBean)).build(); 调用.addInterceptor()方法。

    /* 下载进度拦截器 在okhttp客户端初始化时候添加进去 创建时间 2018/9/4 @author plani */
    public class DownLoadInterceptor implements Interceptor {

    1. private DownLoadBean downLoadBean;
    2. public DownLoadInterceptor(DownLoadBean downLoadBean) {
    3. this.downLoadBean = downLoadBean;
    4. }
    5. @Override
    6. public Response intercept(Chain chain) throws IOException {
    7. //获取到response
    8. Response response = chain.proceed(chain.request());
    9. //打印响应头
    10. Zprint.log(this.getClass(), "响应头", response.headers().toString());
    11. //得到Response 对它的response 进行包装 用我们自己定义的DownLoadResponseBody
    12. return response.newBuilder().body(new DownLoadResponseBody(downLoadBean, response.body())).build();
    13. }

    }

关键代码呢 就是Response response = chain.proceed(chain.request()); 获取response

  1. 直接在retrofit返回结果哪里调用 raw()方法。特别注意 这是retrofit2的Response,不是okhttp3的!

    @Streaming
    @GET
    / Call 里面的泛型T 不能是 okhttp3.Response 。 可以是 retrofit2.Response ,但是T不能为okhttp3.Response /
    Call test(@Url String url);

    Call call = headerTest.test(“https://ccl-cloud.oss-cn-beijing.aliyuncs.com/201809281641cj0928.apk“);
    try {

    1. //这是同步 异步的话 类似
    2. Response response = call.execute();
    3. System.out.println(" 响应头 "+response.raw().headers());

    } catch (IOException e) {

    1. e.printStackTrace();

    }

3.通常来说,我们的retrofi都和Rxjava一起用。这种情况下是这样的

  1. @Streaming
  2. @GET
  3. /* Observable<T> 里面的泛型T 不能是 okhttp3.Response 。 可以是 retrofit2.Response<T> ,但是T不能为okhttp3.Response */
  4. Observable<Response<ResponseBody>> testRxjava(@Url String url);

rxjava 取出 这里要注意 retrofit创建时候添加转化器.addCallAdapterFactory(RxJava2CallAdapterFactory.create())

  1. headerTest.testRxjava("https://下载链接/201809281641cj0928.apk").subscribeOn(Schedulers.newThread())
  2. .subscribe(new Observer<Response<ResponseBody>>() {
  3. @Override
  4. public void onSubscribe(Disposable d) {
  5. }
  6. @Override
  7. public void onNext(Response value) {
  8. //这下面两种都可以
  9. System.out.println(" 响应头 two "+value.headers().toString());
  10. System.out.println(" 响应头 two "+value.raw().headers().toString());
  11. }
  12. @Override
  13. public void onError(Throwable e) {
  14. }
  15. @Override
  16. public void onComplete() {
  17. }
  18. }
  19. );

总结

上面的2 和3 ,我总结的就是 不管是Call 还是Observable也好 ,泛型不能和 okhttp3.Response有关,即便是泛型的泛型 也不行。
如果有不懂的,可以关注我的公众号 “知我饭否” 向我留言。我也会每天更新一些文章,有兴趣的可以扫描下方的二维码

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,380人围观)

还没有评论,来说两句吧...

相关阅读

    相关 retrofit2 获取响应信息

    前言 最近几天晚上时候,一直在修改自己前一段时间写的下载工具。想着把它变成开源库造福大家。原本,以为是很简单的事。结果在下载文件格式哪里,博主陡然发现! 以前自己用的时