retrofit2 + okhttp3 使用示例

293 阅读2分钟

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 接口请求,非常简单实用,适用于常见的应用开发。