1. gradle 配置依赖
implementation('com.squareup.retrofit2:retrofit:2.11.0')
implementation 'com.squareup.retrofit2:converter-gson:2.11.0'
implementation 'com.squareup.okhttp3:logging-interceptor:4.9.1'
备注:以上配置支持Gson解析JSON
2. 创建接口类
interface ApiService {
//示例数据post
@FormUrlEncoded
@POST("/xxx/v1/homepage")
suspend fun postHomeData(@Field ("ID") id: String): BaseResponseData<HomeResponseData>
//示例数据get
@FormUrlEncoded
@GET("/xxx/v1/homepage")
suspend fun getHomeData(@Field ("ID") id: String): BaseResponseData<HomeResponseData>
}
@Field 对应的名称,是客户端和服务端制定好的协议字段对应的名称;
@POST 代表请求方式为post 请求;
@FormUrlEncoded 是请求包体的编码格式,可修改为其他格式;
3. 创建基础Bean类
@Keep
data class BaseResponseData(
@SerializedName("code") val code: String,
@SerializedName("msg") val msg: String,
@SerializedName("data") val data: T
)
4.创建业务HomeResponseData类
xxx 代表JSON字段(@keep,不混淆)
@Keep
data class HomeResponseData(
@SerializedName("xxx") val test1: DataModel?,
@SerializedName("xxx") val test2: Int?,
@SerializedName("xxx") val test3: Int?,
@SerializedName("xxx") val test4: String?,
)
@Keep
data class DataModel(
@SerializedName("module_name") val moduleName: String?,
@SerializedName("module_type") val moduleType: String?,
@SerializedName("sort_order") val sortOrder: Int?,
@SerializedName("list") val list: List<ItemBean>?,
)
@Keep
data class ItemBean(
@SerializedName("img") val imgUrl: String?,
@SerializedName("name") val name: String?,
@SerializedName("id") val id: Int?,
)
5.创建NetRequestApi类,里面实现获取Retrofit的示例
class NetRequestApi {
companion object {
private const val TIMEOUT = 30L
private const val API_URL = "xxx"
/**
* Retrofit 示例获取
*/
fun getRetrofit(): Retrofit {
return Retrofit.Builder()
.baseUrl(API_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(getOkHttpClient())
.build()
}
}
}
6.创建NetRequestApi类,里面实现网络拦截器
class NetRequestApi {
companion object {
/**
* 自定义 OkHttpClient
*/
private fun getOkHttpClient(): OkHttpClient {
return OkHttpClient.Builder().addInterceptor(NetInterceptor())
.connectTimeout(TIMEOUT, TimeUnit.SECONDS)
.readTimeout(TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(TIMEOUT, TimeUnit.SECONDS)
.build()
}
}
}
7.自定义 OkHttpClient
/**
* 重写拦截器
*/
class NetInterceptor : Interceptor {
companion object {
const val TAG = "NetInterceptor"
}
override fun intercept(chain: Interceptor.Chain): Response {
// 获取原始请求和Body
val originalRequest = chain.request()
val originalBody = originalRequest.body
// 新建新的FormBody builder
val bodyBuilder = FormBody.Builder()
// 获取原始请求体中的key和value
val dictionary = mutableMapOf<String, Any>()
originalBody?.let {
val formBody = it as FormBody
for (i in 0 until formBody.size) {
dictionary[formBody.name(i)] = formBody.value(i)
bodyBuilder.add(formBody.name(i), formBody.value(i))
}
}
// 获取公共参数 示例
val timeStamp = xxxx
val sign = xxxxx
// 增加公共参数 示例
bodyBuilder.add("timestamp", timeStamp)
bodyBuilder.add("sign", sign)
// 构建新的请求
val modifiedBody = bodyBuilder.build()
val requestBuilder = originalRequest.newBuilder().method(originalRequest.method, modifiedBody)
return chain.proceed(requestBuilder.build())
}
}
8.发起Api请示(示例)
val apiService = NetRequestApi.getRetrofit().create(ApiService::class.java)
val responseData = apiService.postHomeData(id = xxx)
responseData 就是 序列化后HomeResponseData 的示例,即上面第4步-你的业务类HomeResponseData;此时服务端返回的数据已经以HomeResponseData 示例构造的方式返回回来,直接示例get(.对应的参数)数据即可。
9.总结
以上是使用 retrofit2 + okhttp3 的方式,快速实现Api 接口请求,非常简单实用,适用于常见的应用开发。