简单的说它是一个基于OkHttp的RESTFUL Api请求工具,从功能上来讲和Google的Volley功能上很类似,可是使用上很不类似。程序员
好比你要请求这么一个api,查看知乎专栏的某个做者信息: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注解来描述这个apiide
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请求的状态ui
// 请求数据,而且处理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就是充当了一个适配器(Adapter)的角色:将一个Java接口翻译成一个Http请求,而后用OkHttp去发送这个请求spa
核心思想就是: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发送
组成:
retrofit2.http
包,里面所有是定义HTTP请求的Java注解,好比GET
、POST
、PUT
、DELETE
、Headers
、Path
、Query
等等retrofit2
包中几个类和接口就是所有retrofit的代码了,代码真的不多,很简单,由于retrofit把网络请求这部分功能所有交给了OkHttp了接口:
一、Callback<T>:这个接口就是retrofit请求数据返回的接口,只有两个方法
void onResponse(Response<T> response);和
void onFailure(Throwable t);
二、Converter<F, T>:这个接口主要的做用就是将HTTP返回的数据解析成Java对象,主要有Xml、Gson、protobuf等等,你能够在建立
Retrofit
对象时添加你须要使用的Converter
实现
三、Call<T>:这个接口主要的做用就是发送一个HTTP请求,Retrofit默认的实现是
OkHttpCall<T>
,你能够根据实际状况实现你本身的Call类,这个设计和Volley的HttpStack
接口设计的思想很是类似,子类能够实现基于HttpClient
或HttpUrlConnetction
的HTTP请求工具,这种设计很是的插件化,并且灵活
四、CallAdapter<T>:上面说到过,
CallAdapter
中属性只有responseType
一个,还有一个<R> T adapt(Call<R> call)
方法,这个接口的实现类也只有一个,DefaultCallAdapter
。这个方法的主要做用就是将Call
对象转换成另外一个对象,多是为了支持RxJava才设计这个类的吧
参考文献:http://www.jianshu.com/p/c1a3a881a144