Skip to content

Latest commit

 

History

History
175 lines (141 loc) · 5.17 KB

README_CN.md

File metadata and controls

175 lines (141 loc) · 5.17 KB

LazyPeopleHttp

//下面代码相当于: https://xxx/getUser?userId=$userId
suspend fun getUser(userId: Int): Userfun getUser(userId: Int): Call<User>

//如果在协程中可以这样用:
hf.getUser(0).await()
//如果使用Compose可以这样用:
val user by remember { hf.getUser(0).toState() }
Text("UserName=${user?.name}")

类型安全的HTTP客户端, 适用于Kotlin Multiplatform.

us English | cn 简体中文

使用方式

Step 1.添加依赖:

version =

  • 如果是单平台,在app模块目录内的build.gradle.kts内添加
plugins {
    ...
    id("com.google.devtools.ksp") version "1.8.20-1.0.10"//this,前面的1.8.20对应你的kotlin版本,更多版本参考: https://github.com/google/ksp/releases
}

dependencies {
    ...
    implementation("io.github.ltttttttttttt:LazyPeopleHttp-lib:$version")//this,比如1.1.1
    ksp("io.github.ltttttttttttt:LazyPeopleHttp:$version")//this,比如1.1.1
}
  • 如果是多平台,在common模块目录内的build.gradle.kts内添加
plugins {
    ...
    id("com.google.devtools.ksp") version "1.8.20-1.0.10"//this,前面的1.8.20对应你的kotlin版本,更多版本参考: https://github.com/google/ksp/releases
}

...
val commonMain by getting {
    dependencies {
        ...
        api("io.github.ltttttttttttt:LazyPeopleHttp-lib:$version")//this,比如1.1.1
    }
}

...
dependencies {
    add("kspCommonMainMetadata", "io.github.ltttttttttttt:LazyPeopleHttp:$version")
}
  • 如果你使用的ksp版本小于1.0.9则需要以下配置:

ksp配置

Step 2.接口声明:

@LazyPeopleHttpService
interface HttpFunctions : GetFuns {
    //标准post请求声明,url=post/postB
    @POST("post/postB")
    fun postB(@Field("name") t: String): Call<UserBean>

    //懒人post请求声明,会把方法名当做url,url=postC
    fun postC(name: String): Call<String>

    //suspend post请求声明,url=postA
    suspend fun postA(t: String): String

    //配置动态的url
    @GET("get/getD/{type}")
    @Header("aaa", "bbb")//添加静态的请求头
    fun getD(
        @Url("type") url: String,
        @QueryMap map: Map<String, String?>//可以更灵活,post则使用@FieldMap,
    ): Call<String?>
}

@UrlMidSegment("get")//这个文件里的所有方法都会自动加一个中缀
interface GetFuns {
    @GET("getC")//url=get/getC
    fun getC2(name: String): Call<String>
    
    //url=get/getB
    fun getB(name: String): Call<String>
}

Step 3.接口使用:

//配置ktor的client
private val client = HttpClient {
    defaultRequest {
        //配置baseUrl
        url("http://127.0.0.1:666/")
    }
}
private val config = LazyPeopleHttpConfig(client)
//创建请求接口的实现类
private val hf = HttpFunctions::class.createService(config)

//使用接口的实现类
hf.postB("123").enqueue()//回调异步请求
hf.suspendGetB("111") 或 hf.postB("123").await()//协程异步请求
val data by remember { hf.get().toState() }//返回响应式的State,适用于Compose

Step 4.自定义配置(可选):

/*
 * 当前LazyPeopleHttpService类全局配置
 * [client]ktor请求客户端
 * [serializer]序列化器
 * [encryptor]加解密器
 * [defaultRequestMethod]默认请求方式(不使用注解的方法)
 * [onSuspendError]suspend函数抛出异常时调用
 * [onRequest]成功构造了请求,但发送请求之前调用
 * [onResponse]请求之后调用
 */
class LazyPeopleHttpConfig(...) {
    /**
     * 添加用于构造网络请求的返回值对象的适配器
     * 添加完可以这样声明: fun getUser(): Flow<UserBean>
     */
    fun addCallAdapter()
    
    /**
     * 添加用于hook suspend过程的对象
     */
    fun addSuspendHook()
}

//单独修改一个接口的配置
hf.postB("123").config {
    //this is HttpRequestBuilder
}.enqueue()

ksp {
    //开启运行时配置获取所有注解的功能,不开启时调用[RequestInfo#functionAnnotations]始终返回null
    //arg("getFunAnnotationsWithLazyPeopleHttp", "true")
    //自定义输出文件的规则,参考[CustomizeOutputFileBean],需要一个json文件,内容是List<CustomizeOutputFile>
    //arg("customizeOutputFileWithLazyPeopleHttp", "${project.projectDir.absoluteFile}/customizeOutputFile.json")
    //要将方法名的名称当做url时将某值替换为[functionReplaceTo]
    //arg("functionReplaceFromWithLazyPeopleHttp", "_")
    //要将方法名的名称当做url时将[functionReplaceFrom]替换为设置的值
    //arg("functionReplaceToWithLazyPeopleHttp", "/")
}

Step 5.混淆配置(可选):

# 你自定义的[CallAdapter]中使用到的名字