前言
Retrofit是现在比较流行的网络请求框架,可以理解为okhttp的加强版,底层封装了Okhttp。
准确来说,Retrofit是一个RESTful的http网络请求框架的封装。因为网络请求工作本质上是由okhttp来完成,而Retrofit负责网络请求接口的封装。
https://square.github.io/retrofit/
代理HTTPS无法请求
Android要配置networkSecurityConfig
查看
https://www.psvmc.cn/article/2019-04-03-win-proxy.html
基本配置
添加网络权限
1 | <uses-permission android:name="android.permission.INTERNET"/> |
添加依赖
1 | implementation ("com.squareup.retrofit2:retrofit:2.9.0") |
Kotlin整体示例
新版本的Retrofit已经可以方便使用Kotlin的协程。
添加实体
1 | import java.util.List; |
用户
1 | public class UserVo { |
服务接口
添加suspend关键字,返回类型Response<T>
AppService.kt
1 | import com.xhkjedu.xh_control_appstore.model.ResultListVo |
请求头设置
HeaderInterceptor.kt
1 | import android.util.Log |
超时时间设置
1 | val client = OkHttpClient().newBuilder() |
这三个超时时间分别是:
连接超时时间(Connect Timeout):指的是客户端连接到服务器所需的最大时间。
如果在规定的时间内未能建立连接,则会抛出
java.net.SocketTimeoutException
异常。读取超时时间(Read Timeout):指的是客户端从服务器读取数据的最大时间。比如下载。
如果在规定的时间内未能读取到数据,则会抛出
java.net.SocketTimeoutException
异常。写入超时时间(Write Timeout):指的是客户端向服务器发送数据的最大时间。比如上传。
如果在规定的时间内未能将数据发送完毕,则会抛出
java.net.SocketTimeoutException
异常。
建议:
上传下载和普通接口请求的超时时间分开设置。因为两个的时间差别较大。
管理类
ApiManager.kt
1 | import com.xhkjedu.xh_control_appstore.common.CommonData |
调用
简单调用
1 | GlobalScope.launch { |
ViewModel中调用
BaseViewModel
如果使用Jetpack Compose
BaseViewModel.kt
1 | import androidx.compose.runtime.mutableStateOf |
如果使用DataBinding
1 | import androidx.databinding.ObservableBoolean |
调用
UserViewModel
1 | import android.util.Log |
JAVA整体示例
假如我们要请求
https://www.psvmc.cn/userlist.json
添加实体
1 | import java.util.List; |
用户
1 | public class UserVo { |
请求接口类
1 | import retrofit2.Call; |
创建Retrofit实例
1 | //构建Retrofit实例 |
接口对象实例
1 | //创建网络请求接口对象实例 |
调用
同步调用
1 | //同步请求 |
异步调用
1 | //异步请求 |
设置请求头
添加Interceptor
1 | import android.util.Log; |
其中
intercept 会在每次请求的时候都触发。
在创建实例的时候传入
1 | import com.xhkjedu.xh_control_appstore.common.CommonData |
注解
Retrofit使用大量注解来简化请求,Retrofit将okhttp请求抽象成接口,使用注解来配置和描述网络请求参数。
请求方法注解
请求方法注解 | 说明 |
---|---|
@GET | get请求 |
@POST | post请求 |
@PUT | put请求 |
@DELETE | delete请求 |
@PATCH | patch请求,该请求是对put请求的补充,用于更新局部资源 |
@HEAD | head请求 |
@OPTIONS | options请求 |
@HTTP | 通过注解,可以替换以上所有的注解,它拥有三个属性:method、path、hasBody |
请求头注解
请求头注解 | 说明 |
---|---|
@Headers | 用于添加固定请求头,可以同时添加多个,通过该注解的请求头不会相互覆盖,而是共同存在 |
@Header | 作为方法的参数传入,用于添加不固定的header,它会更新已有请求头 |
请求参数注解
请求参数注解 | 说明 |
---|---|
@Body | 多用于Post请求发送非表达数据,根据转换方式将实例对象转化为对应字符串传递参数,比如使用Post发送Json数据,添加GsonConverterFactory则是将body转化为json字符串进行传递 |
@Filed | 多用于Post方式传递参数,需要结合@FromUrlEncoded使用,即以表单的形式传递参数 |
@FiledMap | 多用于Post请求中的表单字段,需要结合@FromUrlEncoded使用 |
@Part | 用于表单字段,Part和PartMap与@multipart注解结合使用,适合文件上传的情况 |
@PartMap | 用于表单字段,默认接受类型是Map<String,RequestBody>,可用于实现多文件上传 |
@Path | 用于Url中的占位符 |
@Query | 用于Get请求中的参数 |
@QueryMap | 与Query类似,用于不确定表单参数 |
@Url | 指定请求路径 |
请求和响应格式(标记)注解
标记类注解 | 说明 |
---|---|
@FormUrlEncoded | 表示请求发送编码表单数据,每个键值对需要使用@Filed注解 |
@Multipart | 表示请求发送form_encoded数据(使用于有文件上传的场景),每个键值对需要用@Part来注解键名,随后的对象需要提供值 |
@Streaming | 表示响应用字节流的形式返回,如果没有使用注解,默认会把数据全部载入到内存中,该注解在下载大文件时特别有用 |
参数示例
URL上的参数
1 | "user") ( |
Post请求-Form形式
1 |
|
Post请求-JSON形式
1 | "user/emails") ( |
URL上占位符
1 | "orgs/{id}") ( |
文件上传
1 |
|
调用
1 | //声明类型,这里是文字类型 |
多文件上传
1 |
|
调用
1 | File file1 = new File("文件路径"); |