You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Ktor客户端如何正确发送带请求体的POST请求

Ktor POST请求携带JSON请求体的正确实现

你现有代码运行失败的核心原因是缺少Ktor JSON序列化相关配置,且未显式指定请求体格式,按以下步骤修改即可:

    1. 补全项目依赖与插件配置
      首先确保模块级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")
}
    1. 初始化Ktor客户端时安装内容协商插件
      修改KtorModule.provideKtor()方法中HttpClient的初始化逻辑,添加JSON序列化配置:
fun provideKtor(): HttpClient {
    return HttpClient(Android) {
        // 你已有的超时配置、日志拦截器等配置保留
        // 新增内容协商配置
        install(ContentNegotiation) {
            json(Json {
                ignoreUnknownKeys = true
                encodeDefaults = true
                isLenient = true
            })
        }
    }
}
    1. 调整POST请求代码,显式指定请求格式
      修改接口请求逻辑,明确设置Content-Type为JSON,再传入请求体:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 14:33:22