项目地址
Ktor 简介
Ktor 是一个异步开源框架,用于创建微服务和 Web 应用程序。它是由 Jetbrains 用 Kotlin 开发的。它易于安装和使用,如果您想在执行管道中添加一个步骤,它是可扩展的。由于协程,它的异步属性允许它接收多个请求,并且它也是多平台的。
Ktor 是多平台的,是的多平台!这意味着我们可以在任何地方部署 Ktor 应用程序,不仅可以作为服务器,还可以使用 Ktor 客户端在 Android、iOS 或 JS 上使用微服务。Ktor 客户端允许您发出请求和处理响应,通过身份验证、JSON 序列化等特性扩展其功能。
除了可以作为 HTTP 服务器外(仅限于 JVM),Ktor 还包含一个灵活的异步 HTTP 客户端。 这个客户端支持多个可配置的引擎(例如: Apache 、 CIO 、 Jetty、 OkHttp 等等等),并且有自己的一组特性(例如:Auth、Cookies 等等等)。
Ktor 客户端配置
implementation "io.ktor:ktor-client-android:1.6.6" // 如果已经引入 kotlin 协程编译时可能会出现问题
添加了 ktor-client 与 kotlin 协程可能会带来的编译问题
More than one file was found with OS independent path 'META-INF/kotlinx-io.kotlin_module'
可在 Gradle 添加配置:
packagingOptions {
exclude 'META-INF/kotlinx-io.kotlin_module'
exclude 'META-INF/atomicfu.kotlin_module'
exclude 'META-INF/kotlinx-coroutines-io.kotlin_module'
exclude 'META-INF/kotlinx-coroutines-core.kotlin_module'
}
Ktor 发送简单请求
// 这样就能完成一次请求
runBlocking {
HttpClient(Android).use {
val ktorResult = it.get<String>("https://api.apiopen.top/getJoke?page=1&count=2&type=video")
LogUtils.d(ktorResult)
}
}
// 返回结果
{"code":200,"message":"成功!","result":[{"sid":"31577089","text":"孩子厉害\uD83D\uDC4D","type":"video","thumbnail":"http://wimg.spriteapp.cn/picture/2020/1026/5f967bc4e7de2_wpd.jpg","video":"http://uvideo.spriteapp.cn/video/2020/1026/5f967bc4e7de2_wpd.mp4","images":null,"up":"114","down":"3","forward":"0","comment":"6","uid":"23005857","name":"无情无义","header":"http://wimg.spriteapp.cn/profile/large/2020/02/09/5e3fc8f551f9a_mini.jpg","top_comments_content":"厉害不厉害不知道。反正比我强","top_comments_voiceuri":"","top_comments_uid":"11981984","top_comments_name":"不得姐用户","top_comments_header":"http://qzapp.qlogo.cn/qzapp/100336987/D2C67A061C37841FD39E2D6232DE9833/100","passtime":"2020-12-24 18:30:05"},{"sid":"31551566","text":"给我一个你不想买的理由\n\n","type":"video","thumbnail":"http://wimg.spriteapp.cn/picture/2020/0730/5f22acff7206e_wpd.jpg","video":"http://uvideo.spriteapp.cn/video/2020/0730/5f22acff7206e_wpd.mp4","images":null,"up":"68","down":"0","forward":"0","comment":"13","uid":"23131725","name":"天才少女爱我","header":"http://wimg.spriteapp.cn/profile/large/2019/07/04/5d1d909ccbf44_mini.jpg","top_comments_content":null,"top_comments_voiceuri":null,"top_comments_uid":null,"top_comments_name":null,"top_comments_header":null,"passtime":"2020-11-26 10:53:03"}]}
Ktor 添加头信息
runBlocking {
HttpClient(Android).use {
val ktorResult = it.post<String>("https://api.apiopen.top/getJoke?page=1&count=2&type=video"){
headers{
append("user", "111")
append("name", "222")
append("age", "333")
}
}
LogUtils.d(ktorResult)
}
}
Ktor 自动解析返回数据
引入 gson 组件
implementation "io.ktor:ktor-client-gson:1.6.6"
添加 ktor-client-gson 可能出现的编译问题
More than one file was found with OS independent path 'META-INF/ktor-http.kotlin_modul'
More than one file was found with OS independent path 'META-INF/ktor-utils.kotlin_module'
More than one file was found with OS independent path 'META-INF/ktor-client-core.kotlin_module'
可以在 gradle 的 packagingOptions 添加配置:
packagingOptions {
exclude 'META-INF/kotlinx-io.kotlin_module'
exclude 'META-INF/atomicfu.kotlin_module'
exclude 'META-INF/ktor-http.kotlin_module'
exclude 'META-INF/ktor-utils.kotlin_module'
exclude 'META-INF/ktor-client-core.kotlin_module'
exclude 'META-INF/kotlinx-coroutines-io.kotlin_module'
exclude 'META-INF/kotlinx-coroutines-core.kotlin_module'
}
install gson 组件:
runBlocking {
HttpClient(Android){
install(JsonFeature) {
serializer = GsonSerializer {
serializeNulls()
disableHtmlEscaping()
}
}
}.use {
val ktorResult = it.post<KtorTestModel>("https://api.apiopen.top/getJoke?page=1&count=2&type=video"){
headers{
append("user", "111")
append("name", "222")
append("age", "333")
}
}
LogUtils.d(ktorResult)
}
}
KtorTestModel 类
import kotlinx.serialization.Serializable
@Serializable
data class KtorTestModel(var code: Int, var message: String, var result: List<Item>) {
override fun toString(): String {
return "状态码 $code,msg $message,结果 $result "
}
}
item 类
import kotlinx.serialization.Serializable
@Serializable
data class Item(var sid: String, var text: String, var thumbnail: String) {
override fun toString(): String {
return "sid $sid,text $text,thumbnail $thumbnail"
}
}
Ktor 配置 logging
引入 logging 组件
implementation "io.ktor:ktor-client-logging-jvm:1.6.6"
install logging 组件,logcat tag “HttpClient”
runBlocking {
HttpClient(Android){
install(Logging){
level = LogLevel.ALL
logger = Logger.SIMPLE
}
install(JsonFeature) {
serializer = GsonSerializer {
serializeNulls()
disableHtmlEscaping()
}
}
}.use {
val ktorResult = it.post<String>("https://api.apiopen.top/getJoke?page=1&count=2&type=video"){
headers{
append("user", "111")
append("name", "222")
append("age", "333")
}
}
LogUtils.d(ktorResult)
}
}
ktor 配置公共头部
runBlocking {
HttpClient(Android){
defaultRequest {
host = "api.apiopen.top"
header("user", "1111")
header("user1", "1111")
header("user2", "1111")
header("user3", "1111")
}
install(Logging){
level = LogLevel.ALL
logger = Logger.SIMPLE
}
install(JsonFeature) {
serializer = GsonSerializer {
serializeNulls()
disableHtmlEscaping()
}
}
}.use {
val ktorResult = it.post<String>("/getJoke?page=1&count=2&type=video"){
headers{
append("user", "111")
append("name", "222")
append("age", "333")
}
}
LogUtils.d(ktorResult)
}
}
// result
{"code":200,"message":"成功!","result":[{"sid":"31577089","text":"孩子厉害\uD83D\uDC4D","type":"video","thumbnail":"http://wimg.spriteapp.cn/picture/2020/1026/5f967bc4e7de2_wpd.jpg","video":"http://uvideo.spriteapp.cn/video/2020/1026/5f967bc4e7de2_wpd.mp4","images":null,"up":"114","down":"3","forward":"0","comment":"6","uid":"23005857","name":"无情无义","header":"http://wimg.spriteapp.cn/profile/large/2020/02/09/5e3fc8f551f9a_mini.jpg","top_comments_content":"厉害不厉害不知道。反正比我强","top_comments_voiceuri":"","top_comments_uid":"11981984","top_comments_name":"不得姐用户","top_comments_header":"http://qzapp.qlogo.cn/qzapp/100336987/D2C67A061C37841FD39E2D6232DE9833/100","passtime":"2020-12-24 18:30:05"},{"sid":"31551566","text":"给我一个你不想买的理由\n\n","type":"video","thumbnail":"http://wimg.spriteapp.cn/picture/2020/0730/5f22acff7206e_wpd.jpg","video":"http://uvideo.spriteapp.cn/video/2020/0730/5f22acff7206e_wpd.mp4","images":null,"up":"68","down":"0","forward":"0","comment":"13","uid":"23131725","name":"天才少女爱我","header":"http://wimg.spriteapp.cn/profile/large/2019/07/04/5d1d909ccbf44_mini.jpg","top_comments_content":null,"top_comments_voiceuri":null,"top_comments_uid":null,"top_comments_name":null,"top_comments_header":null,"passtime":"2020-11-26 10:53:03"}]}