zoukankan      html  css  js  c++  java
  • Retrofit2 源码解析

    Retrofit是什么

      简单的说它是一个基于OkHttp的RESTFUL Api请求工具,从功能上来说和Google的Volley功能上很相似,但是使用上很不相似。

    Retrofit怎么用

      比如你要请求这么一个api,查看知乎专栏的某个作者信息:

    https://zhuanlan.zhihu.com/api/columns/{user}

     

     首先,你需要创建一个Retrofit对象,并且指定api的域名:

    public static final String API_URL = "https://zhuanlan.zhihu.com";
    
    Create a very simple REST adapter which points the Zhuanlan API.
    Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(API_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .build();

      其次,你要根据api新建一个Java接口,用Java注解来描述这个api

    public interface ZhuanLanApi {
        @GET("/api/columns/{user} ")
        Call<ZhuanLanAuthor> getAuthor(@Path("user") String user)
    }

      再用这个retrofit对象创建一个ZhuanLanApi对象:

    ZhuanLanApi api = retrofit.create(ZhuanLanApi.class);
    
    Call<ZhuanLanAuthor> call = api.getAuthor("qinchao");

    这样就表示你要请求的api是https://zhuanlan.zhihu.com/api/columns/qinchao

      最后你就可以用这个call对象获得数据了,enqueue方法是异步发送http请求的,如果你想用同步的方式发送可以使用execute()方法,call对象还提供cancel()isCancel()等方法获取这个Http请求的状态

    // 请求数据,并且处理response
    call.enqueue(new Callback<ZhuanLanAuthor>() {
        @Override
        public void onResponse(Response<ZhuanLanAuthor> author) {
            System.out.println("name: " + author.getName());
        }
        @Override
        public void onFailure(Throwable t) {
        }
    });

    Retrofit的原理

      Retrofit就是充当了一个适配器(Adapter)的角色:将一个Java接口翻译成一个Http请求,然后用OkHttp去发送这个请求

      核心思想就是:Java的动态代理

      Java动态代理就是给了程序员一种可能:当你要调用某个Class的方法前或后,插入你想要执行的代码

    Retrofit关心的就是method和它的参数args,接下去Retrofit就会用Java反射获取到getAuthor方法的注解信息,配合args参数,创建一个ServiceMethod对象

    ServiceMethod就像是一个中央处理器,传入Retrofit对象和Method对象,调用各个接口和解析器,最终生成一个Request,包含api 的域名、path、http请求方法、请求头、是否有body、是否是multipart等等。最后返回一个Call对象,Retrofit2中Call接口的默认实现是OkHttpCall,它默认使用OkHttp3作为底层http请求client

    使用Java动态代理的目的就要拦截被调用的Java方法,然后解析这个Java方法的注解,最后生成Request由OkHttp发送

    Retrofit的源码分析

    组成:

    1. 一个retrofit2.http包,里面全部是定义HTTP请求的Java注解,比如GETPOSTPUTDELETEHeadersPathQuery等等
    2. 余下的retrofit2包中几个类和接口就是全部retrofit的代码了,代码真的很少,很简单,因为retrofit把网络请求这部分功能全部交给了OkHttp了

    接口:

      1、Callback<T>:这个接口就是retrofit请求数据返回的接口,只有两个方法void onResponse(Response<T> response);和void onFailure(Throwable t);

      2、Converter<F, T>:这个接口主要的作用就是将HTTP返回的数据解析成Java对象,主要有Xml、Gson、protobuf等等,你可以在创建Retrofit对象时添加你需要使用的Converter实现

      3、Call<T>:这个接口主要的作用就是发送一个HTTP请求,Retrofit默认的实现是OkHttpCall<T>,你可以根据实际情况实现你自己的Call类,这个设计和Volley的HttpStack接口设计的思想非常相似,子类可以实现基于HttpClientHttpUrlConnetction的HTTP请求工具,这种设计非常的插件化,而且灵活

    4、CallAdapter<T>:上面说到过,CallAdapter中属性只有responseType一个,还有一个<R> T adapt(Call<R> call)方法,这个接口的实现类也只有一个,DefaultCallAdapter。这个方法的主要作用就是将Call对象转换成另一个对象,可能是为了支持RxJava才设计这个类的吧

    参考文献:http://www.jianshu.com/p/c1a3a881a144

  • 相关阅读:
    unity代码加密for Android,mono编译
    php __invoke 和 __autoload
    VC只运行一个程序实例
    VC单文档对话框添加托盘图标
    技术文档应该怎么写
    项目管理学习
    cannot download, /home/azhukov/go is a GOROOT, not a GOPATH
    Go语言学习
    appium键盘事件
    appium-doctor
  • 原文地址:https://www.cnblogs.com/yl-saber/p/7131203.html
Copyright © 2011-2022 走看看