Ktor Client发送form urlencoded POST请求时请求体为空如何解决
Ktor 2.x 发送x-www-form-urlencoded请求体为空的解决方案
问题根因
所有请求写法失效的核心原因是未将构造的表单内容正确绑定到请求body属性,属于Ktor 2.0版本API变更后的常见踩坑点:
- 第一种
submitForm写法中,顶层调用parameter()只会把参数拼接在URL查询串中,不会写入POST请求体 - 第二种写法里的
formData块未关联到请求body,构造的参数直接被丢弃 - 第三种写法仅在代码块中实例化了
FormDataContent对象,但没有将其赋值给请求体,对象创建后未被实际使用,最终请求的content-length始终为0
可直接复用的正确代码
写法1:基础post请求写法
val response = client.post("http://localhost:5555/oauth/token/") { // 核心:调用setBody绑定表单内容 setBody(FormDataContent(Parameters.build { append("code", authData.authCode!!) append("grant_type", "authorization_code") append("client_id", clientId) append("client_secret", clientSecret) })) header("X-API-Key", getApiKey()) }
写法2:submitForm简化写法
val response = client.submitForm( url = "http://localhost:5555/oauth/token/", // 表单参数必须放在formParameters入参中,不要在DSL顶层调用parameter formParameters = Parameters.build { append("code", authData.authCode) append("grant_type", "authorization_code") append("client_id", clientId) append("client_secret", clientSecret) } ) { header("X-API-Key", getApiKey()) method = HttpMethod.Post }
效果验证
修改后请求会自动带上Content-Type: application/x-www-form-urlencoded; charset=UTF-8请求头,content-length为表单参数实际长度,Express服务端可正常解析到body中的所有参数。当前使用的CIO客户端引擎无需额外引入依赖即可支持该请求类型。
内容的提问来源于stack exchange,提问作者russjr08
相关产品推荐
相关产品推荐

