基本介绍
官网及Github:
Retrofit是一个Android和Java上的类型安全的HTTP客户端(其实Retrofit只是一个基于OkHttp的网络请求框架,真正进行网络操作的是OkHttp)。
基本使用可以看官网就可以。
项目说明及如何使用:
| 
 | 
 | 

Retrofit注解:
Http请求方法:
| 名称 | 说明 | 
|---|---|
| GET | GET请求 | 
| POST | POST请求 | 
| PUT | PUT请求 | 
| DELETE | DELETE请求 | 
| PATCH | PATCH请求 | 
| HEAD | HEAD请求 | 
| OPTIONS | OPTIONS请求 | 
| HTTP | 自定义请求,也可以是以上请求 | 
标记类:
| 名称 | 说明 | 
|---|---|
| FormUrlEncoded | 表示请求体使用 form URL encoding, Fields应该被声明为参数,并且用@Field注解修饰。使用这个注解的请求将被当做application/x-www-form-urlencodedMIME类型。根据  RFC-3986,在 URI-encoded之前字段名和字段值将被UTF-8编码。 | 
| Multipart | 表示请求体是 multi-part, Parts应该当做参数声明,并且使用 @Part注解修饰。(Content-Type:multipart/form-data) | 
| Streaming | 表示响应体的返回数据将会用流的形式返回。(如果没有使用该注解,默认会把数据全部载入内存) | 
参数类:
| 名称 | 说明 | 
|---|---|
| Header | 替换Header相应的目标为指定的值。传递列表或者数组将导致多个同名header且值为列表或者数组中的每一个非空数据。 | 
| HeaderMap | 在指定的Map中添加Headers | 
| Headers | 在方法上使用,会逐条的添加提供的 headers。注意: Headers不会重写,相同名字的header将会被包含在请求中。 | 
| Body | 当你想直接控制一个POST/PUT请求的请求体的时候,使用这个注解在接口方法上(替代被当做请求参数或者表格样式的请求体)。这个对象将会使用Retrofit的Converter实例序列化同时结果将会直接被设置成请求体。不能为空。 | 
| Field | 用于表单编码请求的命名对。值使用 String.valueOf(Object)被转成字符串 ,然后用表单url编码。null值将会被忽略。如果传List或数组将导致多个字段且值为所有List或数组中的非空值。查看说明1. | 
| FieldMap | 用于表单编码请求的命名键/值对。 | 
| Part | 表示一个 multi-part请示的一个part。 | 
| PartMap | 如果一个参数使用这个注解修饰,将会有以下三种方式处理:说明2: | 
| Path | URL段中的占位符。值将会通过 String.valueOf(Object)转成字符串并且 URL编码。说明3: | 
| Query | Query参数将会被添加到URL之后。值使用 String.valueOf(Object)被转成字符串 ,然后用表单url编码。null值将会被忽略。如果传List或数组将导致多个字段且值为所有List或数组中的非空值。说明4: | 
| QueryMap | Query参数的所有键和值都会被添加到URL的后面。说明5: | 
| QueryName | 用来修饰没有值的请求参数,将会被添加到URL的后面。 | 
| Url | 设置URL,和 base URL相对立。baseUrl说明: | 
- 说明1:
| 
 | 
 | 
    调用foo.example("Bob Smith", "Jane Doe") 会产生一个请求体:name=Bob+Smith&name=Jane+Doe。
- 说明2: - 如果是MultipartBody.Part类型将会直接使用内容,并省去注解名(例:@Part MultipartBody.Part part)。
- 如果类型是RequestBody参数的值将会和它的内容类型直接被拿来使用。提供part名在注解中(@Part("foo") RequestBody foo)。
- 其他的对象类型将会使用 converter转成合适的形式。提供part名在注解中(@Part("foo") Image photo)。
 - 如果值为空,则在请求体中省略相应的参数。 
- 如果是
| 
 | 
 | 
- 说明3:
| 
 | 
 | 
- 说明4:
| 
 | 
 | 
- 说明5:
| 
 | 
 | 
- baseUrl说明:
| 
 | 
 | 
Converter解析:
Converter源码:
| 
 | 
 | 
自定义Converter:
- 以GsonConverterFactory为例说明:
- GsonConverterFactory.java
| 
 | 
 | 
- GsonRequestBodyConverter.java
| 
 | 
 | 
- GsonResponseBodyConverter.java
| 
 | 
 | 
CallAdapter解析:
CallAdapter源码:
| 
 | 
 | 
自定义CallAdapter:
- 以RxJavaCallAdapter为例说明:
- RxJavaCallAdapter.java
| 
 | 
 | 
- RxJavaCallAdapterFactory.java
| 
 | 
 | 
整体流程分析:
代码定义:
| 
 | 
 | 
API接口方法定义:
- 给接口服务方法添加相应的方法注解和参数注解:这些注解会在ServiceMethod类中获取。
创建Retrofit:
- Retrofit是在Retrofit的静态内部类Builder的build()方法中创建的。
| 
 | 
 | 
- Platfrom相关代码:
| 
 | 
 | 
- ExecutorCallAdapterFactory相关代码:
| 
 | 
 | 
创建GitHubService:
- 调用Retrofit的create方法,并传入服务接口类的类型
| 
 | 
 | 
- 调用RxJavaCallAdapter的adapt方法:
| 
 | 
 | 
- ServiceMethod中保存了请求和返回的Converter类型
执行请求并接收返回结果:
- 调用动态代理类的相应方法: - 上面已经讲解 
Retrofit独立封装:
不贴代码了,直接上Github地址。
Retrofit和RxJava2封装:
==正在研究中,还没搞定==
Retrofit和RxJava2封装:
==计划中==