[toc]
官网说明:http://square.github.io/retrofit/
推荐教程1:https://www.jianshu.com/p/86e5cddcc753
推荐教程2:https://www.jianshu.com/p/308f3c54abdd
大名鼎鼎的Retrofit库内置了对RxJava的支持
创建Retrofit实例
1 | Retrofit retrofit = new Retrofit.Builder() |
URL注意事件:
- Base Ulr 必须以 /(斜线) 结束,不然会抛出一个IllegalArgumentException
- @Url(@GET,@POST): 不要在开始位置加 /
- URL类似 https://www.baidu.com?key=value 用来作为baseUrl其实是可行的,因为这个URL隐含的路径就是 /(斜线,代表根目录) ,而后面的?key=value在拼装请求时会被丢掉所以写上也没用
接口定义
1 | public interface BlogService { |
注意,这里是interface不是class,所以我们是无法直接调用该方法,我们需要用Retrofit创建一个BlogService的代理对象
1 | BlogService service = retrofit.create(BlogService.class); |
接口调用
1 | Call<ResponseBody> call = service.getBlog(2); |
Converter
在默认情况下Retrofit只支持将HTTP的响应体转换换为ResponseBody,
即返回值都是 Call
1 | public interface BlogService { |
引入Gson支持
1 | compile 'com.squareup.retrofit2:converter-gson:2.0.2' |
通过GsonConverterFactory为Retrofit添加Gson支持
1 | Gson gson = new GsonBuilder() |
这样Retrofit就会使用Gson将ResponseBody转换我们想要的类型。
示例:
1 | @POST("blog") |
被@Body注解的的Blog将会被Gson转换成RequestBody发送到服务器。
1 | BlogService service = retrofit.create(BlogService.class); |
RxJava与CallAdapter
Converter是对于Call
1 | 引入RxJava支持: |
通过RxJavaCallAdapterFactory为Retrofit添加RxJava支持:
1 | Retrofit retrofit = new Retrofit.Builder() |
接口设计:
1 | public interface BlogService { |
使用:
1 | BlogService service = retrofit.create(BlogService.class); |
像上面的这种情况最后我们无法获取到返回的Header和响应码的,如果我们需要这两者,提供两种方案:
- 用Observable<Response
> 代替 Observable ,这里的Response指retrofit2.Response - 用Observable<Result
> 代替 Observable ,这里的Result是指retrofit2.adapter.rxjava.Result,这个Result中包含了Response的实例