【问题标题】:Send JSON data using OkHttp using Kotlin使用 Kotlin 使用 OkHttp 发送 JSON 数据
【发布时间】:2019-11-27 07:49:12
【问题描述】:

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

Code

【问题讨论】:

标签: java json kotlin okhttp3


【解决方案1】:

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

如果您使用 com.squareup.okhttp3:okhttp:4.0.1,创建 MediaTypeRequestBody 对象的旧方法已被弃用,无法在 Kotlin 中使用.

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

import okhttp3.MediaType.Companion.toMediaType
import okhttp3.RequestBody.Companion.toRequestBody

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

val mediaType = "application/json; charset=utf-8".toMediaType()

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

val requestBody = myJSONObject.toString().toRequestBody(mediaType)

【讨论】:

  • 如果“Companion”变成读取尝试使用此导入,我该怎么办?
【解决方案2】:

你需要创建一个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()

【讨论】:

  • 使用 'parse(String): MediaType?' 给我以下错误是一个错误。移至扩展功能
  • 当然,您需要处理 parse 方法可以返回 null 的事实。更正了答案。
  • requestBuilder.post(RequestBody.create( MediaType.parse("application/json; charset=utf-8")!!, "{\"jsondata\":0}") 。给出一个错误 - Using 'parse(String): MediaType?' is an error.moved to extension function
  • 你在使用implementation 'com.squareup.okhttp3: okhttp: 3.12.1'吗?我更新了答案。
  • 我正在使用实现 "com.squareup.okhttp3:okhttp:4.0.1" 我无法弄清楚如何创建 post 方法中所需的 RequestBody 参数。
【解决方案3】:

在依赖项中的 build.gradle 中,确保您正在使用

dependencies {
    ...
    implementation "com.squareup.okhttp3:okhttp:4.0.1"
}

然后,进行同步,Android Studio IDE 将为您提供

import okhttp3.MediaType.Companion.toMediaType

之后你就可以了

val contentType = "application/json".toMediaType()

【讨论】:

    猜你喜欢
    • 2021-03-17
    • 1970-01-01
    • 2021-05-28
    • 2019-07-26
    • 2022-12-07
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 2015-12-31
    相关资源
    最近更新 更多