
本文详细讲解如何在 Android 中通过 OkHttp 发送纯文本(plain text)作为 POST 请求的请求体,无需使用 FormBody 或 MultipartBody 等复杂构造器,仅需一行 .toRequestBody() 即可完成。
本文详细讲解如何在 android 中通过 okhttp 发送纯文本(plain text)作为 post 请求的请求体,无需使用 formbody 或 multipartbody 等复杂构造器,仅需一行 `.torequestbody()` 即可完成。
OkHttp 原生支持纯文本请求体,但关键在于:不能直接传入字符串调用 .post(),而必须将字符串转换为 RequestBody 对象,并显式指定 MIME 类型与字符编码。OkHttp 的 String.toRequestBody() 扩展函数(Kotlin)或 RequestBody.create()(Java)正是为此设计。
✅ 正确写法(Kotlin)
val myBody = "my own body text that my server understands"
val mediaType = "text/plain; charset=utf-8".toMediaType() // 必须声明 charset,否则服务器可能解析乱码
val request = Request.Builder()
.url("https://your-api.com/endpoint")
.post(myBody.toRequestBody(mediaType)) // ✅ 核心:转为 RequestBody
.build()
okHttpClient.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
// 处理网络异常
}
override fun onResponse(call: Call, response: Response) {
if (response.isSuccessful) {
println("Response: ${response.body?.string()}")
} else {
println("HTTP Error: ${response.code}")
}
}
})
? 提示:toMediaType() 是 OkHttp 4.x+ 的 Kotlin 扩展函数(需 import okhttp3.MediaType.Companion.toMediaType),若使用 OkHttp 3.x,请改用 MediaType.parse("text/plain; charset=utf-8")。
? 为什么 .post(String) 不可用?
OkHttp 的 Request.Builder.post() 方法只接受 RequestBody 类型参数,不存在重载的 post(String) 方法。直接传入字符串会导致编译错误——这正是你遇到 "does not work" 的根本原因。
Android 开发调试技能,通过系统 ADB 工具操作 Android 设备。以下场景必须触发此技能:(1) 直接 ADB 操作——安装 APK、查看设备列表、抓取 logcat 日志、查看已安装应用、清除应用数据、截图、重启设备、拉取/推送文件、查看 CPU/内存/电池信息、adb shell 操作;(2)...
⚠️ 注意事项
- 务必指定 charset=utf-8:即使服务器默认支持 UTF-8,显式声明可避免中文、Emoji 等字符被错误解码;
- 推荐使用 enqueue() 而非 execute():Android 主线程禁止网络操作,execute() 需在子线程调用,而 enqueue() 自动异步执行,更安全;
- Content-Type 须与服务端预期一致:若后端要求 text/plain,就不要误设为 application/json;如需其他类型(如 text/x-markdown),按需调整 MediaType;
- 大文本建议启用 Gzip 压缩:可在 OkHttpClient 构建时添加 addInterceptor(GzipRequestInterceptor())(需自定义拦截器)。
✅ 替代方案?其实无需替代
OkHttp 完全胜任纯文本请求——它轻量、高效、API 清晰。除非项目已深度绑定 Retrofit,否则完全没有必要引入其他 HTTP 库(如 Volley 或 HttpURLConnection 封装)。Retrofit 本身也基于 OkHttp,底层逻辑一致。
总之,牢记这一行核心代码:
"your text".toRequestBody("text/plain; charset=utf-8".toMediaType())
即可干净、可靠地发送任意纯文本请求体。










