使用 Kotlin 使用 OkHttp 发送 JSON 数据

Jay*_*uja 3 java json kotlin okhttp3

我正在尝试使用 OKhttp 库将 JSON 数据发送到服务器,但无法为其找出正确的语法。尝试了这篇文章中提供的解决方案okhttp3 RequestBody in Kotlin该类目前已弃用。

代码

Sta*_*een 6

您需要创建一个 okhttp3.Request.Builder 类型的对象并通过 post 方法添加 okhttp3.RequestBody

val okHttpClient: OkHttpClient = ...
//val httpUrl = HttpUrl.parse("string url") ?: throw IllegalArgumentException("wrong url $url")//3.12.1
val httpUrl = "string url".toHttpUrl()//4.0.1
val httpUrlBuilder = httpUrl.newBuilder()
val requestBuilder = Request.Builder().url(httpUrlBuilder.build())
//val mediaTypeJson = MediaType.parse("application/json; charset=utf-8") ?: throw IllegalArgumentException("wrong media type")//3.12.1
val mediaTypeJson = "application/json; charset=utf-8".toMediaType()//4.0.1
val jsonString = "{\"jsondata\":0}"
requestBuilder.post(
jsonString.toRequestBody(mediaTypeJson)//4.0.1
//RequestBody.create(mediaTypeJson, jsonString)//3.12.1
)
val call = okHttpClient.newCall(requestBuilder.build())
... = call.execute()
Run Code Online (Sandbox Code Playgroud)


Dev*_*nom 6

为了更清楚地了解上面给出的答案,这是您可以使用扩展功能的方式。

如果您正在使用com.squareup.okhttp3:okhttp:4.0.1创建MediaTypeRequestBody对象的旧方法,则已弃用并且不能在Kotlin 中使用

如果您想使用扩展函数从字符串中获取MediaType对象和ResponseBody对象,请首先将以下行添加到您希望使用它们的类中。

import okhttp3.MediaType.Companion.toMediaType
import okhttp3.RequestBody.Companion.toRequestBody
Run Code Online (Sandbox Code Playgroud)

您现在可以通过这种方式直接获取MediaType的对象

val mediaType = "application/json; charset=utf-8".toMediaType()
Run Code Online (Sandbox Code Playgroud)

要获取RequestBody的对象,首先将要发送的 JSONObject 以这种方式转换为字符串。您必须将 mediaType 对象传递给它。

val requestBody = myJSONObject.toString().toRequestBody(mediaType)
Run Code Online (Sandbox Code Playgroud)

  • 如果“Companion”在尝试使用此导入时变成读取状态,我该怎么办? (2认同)