Retrofit
本文介绍 OkHttp 和 Retrofit 的基本使用,包括:
创建和配置
OkHttpClient创建和配置
Retrofit如何使用
Retrofit定义接口发起请求关于
Retrofit中method,path,query param,body,Header注解声明的介绍。
添加依赖
1  | // 网络请求  | 
创建 OkHttp
Retrofit 是对 OkHttp 的封装,提供了使用注解更简单的构建各种请求,配置各种参数的方式。本质发起网络请求的还是 OkHttp,但 Retrofit 让这一操作更加的简单优雅。
创建一个 OkHttpClent 并进行简单配置
1  | /**  | 
创建 Retrofit
OkHttp 只负责发起网络请求,维护网络连接等操作,而 Retrofit 帮我们将网络传输的数据转换为可用的 model 对象,并且提供简单的数据处理方式。
配置 CallAdapterFactory 为 RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io()) 用来将返回的数据转换为 RxJava 的 Observable 对象,但是本文还没涉及到 RxJava 的部分。
配置 ConverterFactory  为 GsonConverterFactory.create(new Gson()) 用来使用 GSON 将网络数据序列化为可用对象。
ps:baseUrl 要求以 / 结尾,而请求的 path 要求不以 / 开头,也就是说我们需要类似 https://www.baidu.com/ 的形式。
1  | /**  | 
创建 api 服务接口
创建接口类,使用注解声明网络请求的方法和相关参数,这里只是一个简单的例子,更多参数和配置将在后面说明,如:
1  | public interface ApiService {  | 
使用 Retrofit 初始化 ApiService,获取到 ApiService 的实例之后就可以使用该实例发起请求。
我使用 ApiRequest 持有 ApiService 的实例,同时 ApiRequest 是一个单例,作为发起网络请求的管理者。
1  | private void createService() {  | 
发起请求
1  | public static void getUserInfo() {  | 
下面对 Retrofit 中 method,path,qurey,body,header几个部分分别说明。
Method
Retrofit 支持 GET,POST,PUT,DELETE,HEAD,OPTION 等请求方式,并有对应的注解。
1  | (GET_USER_INFO)  | 
PATH
请求路径,请求路径中可以包含参数,并在参数中使用 @PATH 注解来动态改变路径,
比如路径 api/v1/user/{id},使用注解 @PATH("id") Long id 即可改变路径中 {id} 请求时的值。
1  | // path 中不包含参数  | 
Body
发送 POST 、PUT 请求时通常需要携带 body 数据,使用 @Body 注解,如下:
1  | (PUT_EDIT_BABY)  | 
Query
配置 UrlQuery 参数,比如 api/v1/user/list?limit=100&offset=10 这种类型。有两种配置方式:
第一种使用 @Query 注解,如 @Query("userId") Long userId 的形式。这种形式可以传递 null 值,如果某个参数为 null,将不会拼接在 url 后面。
第二种使用 @QueryMap 注解,如 @QureyMap Map<String,String> params  的形式。这种形式传递一个 map 作为参数,但是 map 中 value 不能为 null,否则会抛出异常。
1  | (GET_BABY_RELATION_LIST)  | 
Header
静态 Header,使用 @Headers 注解添加在请求接口上,用法如下:
1  | ({"key:value","key:value"})  | 
局部动态 Header,使用 @Header("key") 和 @HeaderMap 注解添加在请求参数上,动态配置,用法如下:
1  | ("Authorization") String auth  | 
全局配置 Header,为 OkHttp 添加 Interceptor,需要注意的是 addNetWorkIntercepror() 和 addInterceptor() 的区别。当进入 netWorkInterceptor 时已经添加了 User-Agent 等 Header,此时要把自己的 Header 一个一个 addHeader() 进去,防止把原来的冲掉。
1  | public final class HeaderInterceptor implements Interceptor {  | 
Todo
更多内容还没有涉及…
1  | // 表单提交  |