Android Ktor客户端如何正确发送带请求体的POST请求
Ktor POST请求携带JSON请求体的正确实现
你现有代码运行失败的核心原因是缺少Ktor JSON序列化相关配置,且未显式指定请求体格式,按以下步骤修改即可:
- 补全项目依赖与插件配置
首先确保模块级Gradle配置中引入了Kotlin序列化插件、Ktor内容协商与JSON序列化依赖:
- 补全项目依赖与插件配置
// 模块级build.gradle.kts 插件配置块 plugins { id("com.android.application") id("org.jetbrains.kotlin.android") // 新增Kotlin序列化插件,版本号和你项目使用的Kotlin版本保持一致 id("kotlinx-serialization") version "1.9.0" } // 依赖配置块 dependencies { // 你已有的Ktor客户端核心、Android引擎依赖 // 新增以下两个依赖,版本号和你使用的Ktor客户端版本保持一致 implementation("io.ktor:ktor-client-content-negotiation:2.3.4") implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.4") }
- 初始化Ktor客户端时安装内容协商插件
修改KtorModule.provideKtor()方法中HttpClient的初始化逻辑,添加JSON序列化配置:
- 初始化Ktor客户端时安装内容协商插件
fun provideKtor(): HttpClient { return HttpClient(Android) { // 你已有的超时配置、日志拦截器等配置保留 // 新增内容协商配置 install(ContentNegotiation) { json(Json { ignoreUnknownKeys = true encodeDefaults = true isLenient = true }) } } }
- 调整POST请求代码,显式指定请求格式
修改接口请求逻辑,明确设置Content-Type为JSON,再传入请求体:
- 调整POST请求代码,显式指定请求格式
override suspend fun getListOfAllCompanies(): ResponseModel<List<NetworkAllCompaniesModel>> = KtorModule.provideKtor().post(HttpRoutes.GET_LIST_OF_ALL_COMPANIES) { // 核心:指定请求体为JSON格式 contentType(ContentType.Application.Json) setBody(Body1(page = 2, countPerPage = 20)) }.body() @Serializable data class Body1( val page: Int, val countPerPage: Int, )
常见排查点:
- 如果接口参数是下划线命名(比如
count_per_page),需要给实体类字段加@SerialName("实际接口字段名")注解做映射,和接口要求的字段名完全对齐- 确认接口路径拼接正确,BaseURL和具体接口路径不要写错
- 如果接口需要鉴权token等公共请求头,在请求块中通过
header("头字段名", "对应值")补充即可
内容的提问来源于stack exchange,提问作者Saeed Noshadi
相关产品推荐
相关产品推荐

