Android中如何使用OkHttp发送纯文本作为请求体?
解决OkHttp发送纯文本POST请求的问题
OkHttp完全支持发送纯文本请求体,你只是没用到正确的API——post()方法需要传入RequestBody类型的参数,而非直接传字符串。以下是修正后的Kotlin代码:
val myBody = "my own body text that my server understands" // 定义纯文本的MediaType,指定编码格式 val mediaType = MediaType.parse("text/plain; charset=utf-8")!! // 将字符串转换为RequestBody对象 val requestBody = RequestBody.create(mediaType, myBody) val request = Request.Builder() .url(myUrl) .post(requestBody) // 传入正确的RequestBody实例 .build() okHttpClient.newCall(request).enqueue(object : Callback { override fun onFailure(call: Call, e: IOException) { // 处理请求失败逻辑 } override fun onResponse(call: Call, response: Response) { // 处理响应逻辑 response.use { if (!it.isSuccessful) throw IOException("Unexpected code $it") val responseContent = it.body?.string() } } })
如果使用OkHttp 4及以上版本,RequestBody.create()已被标记为过时,可以改用更简洁的扩展函数写法:
val requestBody = "my own body text that my server understands" .toRequestBody("text/plain; charset=utf-8".toMediaTypeOrNull())
替代方案(若不想使用OkHttp)
如果确实需要更换HTTP客户端,可以用Java原生的HttpURLConnection实现纯文本POST请求:
val url = URL(myUrl) val connection = url.openConnection() as HttpURLConnection connection.requestMethod = "POST" connection.setRequestProperty("Content-Type", "text/plain; charset=utf-8") connection.doOutput = true // 写入纯文本请求体 val outputStream = connection.outputStream outputStream.write(myBody.toByteArray(Charsets.UTF_8)) outputStream.flush() outputStream.close() // 获取响应内容 val responseCode = connection.responseCode val responseBody = if (responseCode == HttpURLConnection.HTTP_OK) { BufferedReader(InputStreamReader(connection.inputStream)).use { it.readText() } } else { BufferedReader(InputStreamReader(connection.errorStream)).use { it.readText() } } connection.disconnect()
内容的提问来源于stack exchange,提问作者abcjeff
相关产品推荐
相关产品推荐

