Retrofit是什么
简单的说它是一个基于OkHttp的RESTFUL Api请求工具,从功能上来说和Google的Volley功能上很相似,但是使用上很不相似。
Retrofit怎么用
比如你要请求这么一个api,查看知乎专栏的某个作者信息:
首先,你需要创建一个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的源码分析
组成:
- 一个
retrofit2.http
包,里面全部是定义HTTP请求的Java注解,比如GET
、POST
、PUT
、DELETE
、Headers
、Path
、Query
等等 - 余下的
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
接口设计的思想非常相似,子类可以实现基于HttpClient
或HttpUrlConnetction
的HTTP请求工具,这种设计非常的插件化,而且灵活
4、CallAdapter<T>:上面说到过,
CallAdapter
中属性只有responseType
一个,还有一个<R> T adapt(Call<R> call)
方法,这个接口的实现类也只有一个,DefaultCallAdapter
。这个方法的主要作用就是将Call
对象转换成另一个对象,可能是为了支持RxJava才设计这个类的吧
参考文献:http://www.jianshu.com/p/c1a3a881a144