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

使用OkHTTP在Kotlin中发送POST请求时请求体为空的问题

问题:OkHTTP发送POST请求时请求体为空

我在Kotlin项目中使用OkHTTP(4.9.1版本)发送POST请求,但服务器端始终接收到空的请求体。以下是我的代码片段:

import java.util.*
import android.os.AsyncTask
import android.util.Log
import okhttp3.*//okhttp3 4.9.1
import java.io.IOException

class NetworkTask : AsyncTask<String, Void, String>() {

    override fun doInBackground(vararg params: String?): String {
        val name = params[0] as String
        Log.d("NetworkTask", "name: $name")
        val url = "some url"
        val requestBody = FormBody.Builder()
            .add("name", name)
            .build()

        val request = Request.Builder()
            .url(url)
            .post(requestBody)
            .build()

        Log.d("NetworkTask", "Request URL: ${request.url}")
        Log.d("NetworkTask", "Request method: ${request.method}")

        val client = OkHttpClient()

        client.newCall(request).enqueue(object : Callback {
            override fun onFailure(call: Call, e: IOException) {
                println("Failed to send POST request: ${e.message}")
            }

            override fun onResponse(call: Call, response: Response) {
                println("POST request sent successfully $response")
            }
        })
        return "Request sent"
    }
}

预期与实际结果

  • 预期服务器日志显示:body:{name: "John"}
  • 实际服务器日志返回:body:{}

解决方向

1. 匹配服务器的请求体格式

你当前用FormBody构建的是**表单格式(application/x-www-form-urlencoded)**的请求体,如果服务器期望的是JSON格式(application/json),就会解析不到数据。若服务器要求JSON,替换请求体为JSON格式:

// 构建JSON请求体
val jsonBody = """{"name":"$name"}"""
val requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), jsonBody)

2. 验证请求体是否正确生成

在代码中添加日志,确认请求体内容是否正常:

Log.d("NetworkTask", "Request body: ${requestBody.toString()}")
// 针对FormBody,遍历参数打印细节
if (requestBody is FormBody) {
    for (i in 0 until requestBody.size()) {
        Log.d("NetworkTask", "参数 ${requestBody.name(i)}: ${requestBody.value(i)}")
    }
}

3. 修正AsyncTask的异步调用问题

AsyncTask的doInBackground中使用enqueue(异步执行),可能因AsyncTask生命周期结束导致请求未正常发送。可以改用同步调用,或用协程替代AsyncTask:

// 同步调用示例(注意:需确保不在主线程执行)
try {
    val response = client.newCall(request).execute()
    println("响应内容:${response.body?.string()}")
} catch (e: IOException) {
    e.printStackTrace()
}

4. 检查拦截器是否修改请求体

若配置了自定义拦截器,确认拦截器没有清空或修改请求体内容,确保请求体完整传递到服务器。

内容的提问来源于stack exchange,提问作者chang Nana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:00:27