当前位置:   article > 正文

Kotlin跨平台的网络请求框架-跨平台的Retrofit_kotlin网络请求框架

kotlin网络请求框架

前言

一般安卓开发中网络请求框架都是使用OkHttp+Retrofit,但其只能应用于jvm平台上

而Kotlin可用于jvm,js,native

因此一个Kotlin跨平台的网络请求框架必不可少

而ktor-client是Kotlin官方提供的网络请求框架,可以跨平台的进行网络请求(官网)
与之对应的还有ktor-server可以用来写服务器端(但这不是这篇文章的重点)

但ktor-client使用起来还是稍微有些麻烦,所以我们可以模仿Retrofit开发一个更方便使用的跨平台网络请求框架(单平台也可以使用)

也就是接下来的主角:懒人Http框架,地址: LazyPeopleHttp · GitHub

其不仅比Retrofit使用更方便,而且性能更高(因为用编译时替代了运行时反射)

正文

  1. //下面代码相当于: https://xxx/getUser?userId=$userId
  2. suspend fun getUser(userId: Int): User
  3. fun getUser(userId: Int): Call<User>
  4. //如果使用Compose可以这样用:
  5. val user by remember { hf.getUser(0).toState() }
  6. Text("UserName=${user?.name}")

使用方式

Step 1.添加依赖:

  • 如果是单平台,在app模块目录内的build.gradle.kts内添加
  1. plugins {
  2. ...
  3. id("com.google.devtools.ksp") version "1.8.20-1.0.10"//this,前面的1.8.20对应你的kotlin版本,更多版本参考: https://github.com/google/ksp/releases
  4. }
  5. dependencies {
  6. ...
  7. implementation("io.github.ltttttttttttt:LazyPeopleHttp-lib:1.0.9")//最新版本可以看github地址
  8. ksp("io.github.ltttttttttttt:LazyPeopleHttp:1.0.9")
  9. }
  • 如果是多平台,在common模块目录内的build.gradle.kts内添加
  1. plugins {
  2. ...
  3. id("com.google.devtools.ksp") version "1.8.20-1.0.10"//this,前面的1.8.20对应你的kotlin版本,更多版本参考: https://github.com/google/ksp/releases
  4. }
  5. ...
  6. val commonMain by getting {
  7. dependencies {
  8. ...
  9. api("io.github.ltttttttttttt:LazyPeopleHttp-lib:1.0.9")
  10. }
  11. }
  12. ...
  13. dependencies {
  14. add("kspCommonMainMetadata", "io.github.ltttttttttttt:LazyPeopleHttp:1.0.9")
  15. }
  • 如果你使用的ksp版本小于1.0.9则需要以下配置:

ksp配置

Step 2.接口声明:

  1. @LazyPeopleHttpService
  2. interface HttpFunctions {
  3. //标准post请求声明
  4. @POST("post/postB")
  5. fun postB(@Field("name") t: String): Call<UserBean>
  6. //懒人post请求声明,会把方法名当做url,其下划线会转换为斜杠
  7. fun post_postC(name: String): Call<String>
  8. //suspend post请求声明
  9. suspend fun post_postA(t: String): String
  10. //标准get请求声明
  11. @GET("get/getA")
  12. fun getA(@Query("t") t2: String): Call<String>
  13. //懒人get请求声明
  14. fun get_getB(name: String): Call<UserBean>
  15. //suspend get请求声明
  16. suspend fun suspendGetB(name: String): UserBean
  17. //添加静态的请求头
  18. @Header("aaa", "bbb")
  19. fun post_checkHeader(): Call<String?>
  20. //配置动态的url
  21. @GET("get/getD/{type}")
  22. fun getD(@Url("type") url: String): Call<String?>
  23. //可以声明具体函数,此时不会生成额外的方法
  24. fun ccc(): Int = 0
  25. }

Step 3.接口使用:

  1. //配置ktor的client
  2. private val client = HttpClient {
  3. defaultRequest {
  4. //配置baseUrl
  5. url("http://127.0.0.1:666/")
  6. }
  7. }
  8. private val config = LazyPeopleHttpConfig(client)
  9. //创建请求接口的实现类
  10. private val hf = HttpFunctions::class.createService(config)
  11. //使用接口的实现类
  12. hf.postB("123").enqueue()//回调异步请求
  13. hf.suspendGetB("111")//协程异步请求
  14. val data by remember { hf.get().toState() }//返回响应式的State,适用于Compose

Step 4.自定义配置:

  1. /*
  2. * 当前LazyPeopleHttpService类全局配置
  3. * [client]ktor请求客户端
  4. * [serializer]序列化器
  5. * [encryptor]加解密器
  6. * [defaultRequestMethod]默认请求方式(不使用注解的方法)
  7. * [onSuspendError]suspend函数抛出异常时调用
  8. * [onRequest]成功构造了请求,但发送请求之前调用
  9. * [onResponse]请求之后调用
  10. */
  11. class LazyPeopleHttpConfig(...)
  12. //单独修改一个接口的配置
  13. hf.postB("123").config {
  14. //this is HttpRequestBuilder
  15. }.enqueue()
  16. ksp {
  17. //开启运行时配置获取所有注解的功能,不开启时调用[RequestInfo#functionAnnotations]始终返回null
  18. //arg("getFunAnnotationsWithLazyPeopleHttp", "true")
  19. //你甚至可以修改创建Call的方法,来返回自定义的Call
  20. //arg("createCallFunNameWithLazyPeopleHttp", "CallAdapter.createCall2")
  21. }

对Kotlin或KMP感兴趣的同学可以进Q群 101786950

如果这篇文章对您有帮助的话

可以扫码请我喝瓶饮料或咖啡(如果对什么比较感兴趣可以在备注里写出来)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/959152
推荐阅读
相关标签
  

闽ICP备14008679号