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 | // 表单提交 |