本文中使用 Retrofit 2.3.0 版本
侧重于如何使用,至于原理暂不考虑。
面临秋招的准大四狗,看了看各大公司的面经,什么 Retrofit、RxJava,还有一众图片加载库 比如 Glide、Picasso 等等都快成了标配了,动辄分析其源码。原来一直以自己入门尚短为由拖沓没去了解这些开源库(实际上可以算作是18年年初才开始接触),现在不得不学习这戏开源库了。
于是乎,以这篇介绍 Retrofit 的使用开始慢慢苦修之路吧。
1. 简介
1.1 Retrofit 是啥?
Retrofit 是大名鼎鼎的 Square 公司开源的一个 网络加载框架,它的底层封装了 OkHttp 3,准确的说,网络请求的工作本质是 OkHttp 完成的,而 Retrofit 仅仅负责网络请求接口的封装。
Retrofit 的一大特点就是大量的注解使用,不过这也是我暂时比较疑惑的一点?为什么使用注解?
至于 Retrofit 相较于 OkHttp 3 的优势,我现在了解的并不很深,仅仅知道是由于 Retrofit + RxJava 的便利使得众多开发者选择使用 Retrofit。
上述可能有误,但暂时理解就是这样的。挖下的坑自然等到理解加深后再来填了。
1.2 Retrofit 的好处?
初步理解的优点:
- 支持 同步&异步
- 提供对 RxJava 的支持
- 使用起来比较简单,通过注解即可配置网络请求参数
网传的一些比较迷惑的优点:
- 性能好、处理快(需要分析源码)
- 解耦彻底(据网上的文章分析,Retrofit 为了实现高度解耦,采用了大量的设计模式,同样需要分析源码)
2. 使用介绍
2.1 注解
在介绍如何使用之前,先来学习一下前置技能:Retrofit 中的注解。
Retrofit 中的注解可以分为三个类型:网络请求方法、标志以及网络请求参数。
2.1.1 网络请求方法
图示如下:
序号 | 注解代码 | 说明 |
---|---|---|
1 | @GET | GET 请求 |
2 | @POST | POST 请求 |
3 | @PUT | PUT 请求 |
4 | @DELETE | DELETE 请求 |
5 | @PATCH | PATCH 请求 |
6 | @HEAD | HEAD 请求 |
7 | @OPTIONS | OPTIONS 请求 |
8 | @HTTP | 供自定义扩展 |
说明:
对于序号 1 ~ 7 :
- 需要接收一个字符串表示
path
,与后面的baseUrl
组成完整的url
接收的
path
字符串可以使用 “变量”,如{id}
,结合@Path("id")
注解为{id}
提供值public interface Api{ //注意此处 Call 的泛型是 ResponseBody,表示将直接返回服务器响应的 ResponseBody,即未作任何处理 @GET("info/{id}") Call<ResponseBody> getInfo<@Path("id") int id> }
当然也可以不指定
path
,此时通过@Url
注解指定url
public interface Api{ @GET Call<ResponseBody> getInfo<@Url String url> }
- 需要接收一个字符串表示
对于序号 8:
- 可用于替换 以上 7 个,以及其扩展;
- 有 3 个属性 method、path、hasBody
interface Api { /** * method 请求方法,不区分大小写 * path 路径, * hasBody 是否有请求体 */ @HTTP(method = "DELETE", path = "remove/", hasBody = true) Call<ResponseBody> deleteObject(@Body RequestBody object); }
2.1.2 标志
图示图下:
注解代码 | 说明 |
---|---|
@FormUrlEncoded | 表示请求主体将使用表单 |
@Multipart | 表示请求体是多部分的 |
@Streaming | 在返回响应的方法中处理 Response(没有该注释,则会将body()转换为 byte[],并全部载入到内存,之后从内存中读取数据) |
说明:
- FormUrlEncoded
- 需要添加:
Content-Type:application/x-www-form-urlencoded
- 需要添加:
- Multipart
- 需要添加:
Content-Type: multipart/form-data
- 需要添加:
- Streaming
- 数据量大时,需要使用该注解,以免将数据全部载入内存造成 OOM
2.1.3 网络请求参数
图示如下:
注解代码 | 说明 |
---|---|
@Body | 直接指定 PUT/POST 的请求体,但并非作为请求参数或者表单的请求体 |
@Field | 表单字段 |
@FieldMap | 以键值对方式设置表单字段 |
@Header | 添加请求头(不固定的请求头) |
@HeaderMap | 以 Map 形式添加请求头 |
@Headers | 添加包含值的请求头(固定的请求头) |
@Part | 表示一个多部分请求的单个部分(多用于文件上传) |
@PartMap | 表示一个多部分请求的 name 和 value 字段(多用于文件上传) |
@Path | 替换 URL 中被 {} 包裹起来的字段 |
@Query | 向 url 追加参数 |
@QueryMap | 向 url 追加键值对参数 |
@QueryName | 为没有 value 的 name 字段传值 |
@Url | 使用全路径复写 baseUrl,用于非统一 baseUrl 的场景 |
上面这些注解,其实我也了解的不是很多,示例代码可以打开对应链接,查看官方示例。
说明:
Body
//默认情况下 @PUT/@POST("user/info") Call<ResponseBody> createUser(@Body User user); //为 Retorfit 添加转换器,此时可以将 ResponseBody 转换为指定类 @PUT/@POST("user/info") Call<User> createUser(@Body User user);
Field & FieldMap
二者体现在请求体(表单),即适用于POST方式(注意和 Query 等的区别)
Field
@FormUrlEncoded @POST("login") Call<ResponseBody> userLogin(@Field("name") String name,@Field(