okhttp3 RequestBody在Kotlin

Ali*_*RAL 5 java android kotlin okhttp3

我想发送这样的请求正文:

我该如何发送?我将其作为课程发送吗?

"email":{
    "emailto":"foo@bar.com",
    "emailfrom":"foo@bar.com",
    "emailcc":"foo@bar.com",
    "emailbcc":"foo@bar.com",
    "emailsubject":"Subject",
    "emailtag":"Information",
    "emailtextbody":"---",
    "attachments":[]
}
Run Code Online (Sandbox Code Playgroud)
val formBody = FormBody.Builder()
    .add("email", "Your message")
    .build()

val request = Request.Builder()
    .url(url)
    .post(formBody)
    .addHeader("_Token","")
    .addHeader("Content-Type","application/json")
    .build()
Run Code Online (Sandbox Code Playgroud)

Dev*_*nom 9

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

如果您使用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)


hlu*_*kyi 6

我强烈建议在这种情况下使用Retofit,但如果你真的需要处理 raw Request/Response那么你的解决方案看起来像:

val json = """
"email":{
    "emailto":"${emailto}",
    "emailfrom":"${emailfrom}",
    "emailcc":"${emailcc}",
    "emailbcc":"${emailbcc}",
    "emailsubject":"${emailsubject}",
    "emailtag":"${emailtag}",
    "emailtextbody":"${emailtextbody}",
    "attachments":[]
}
""".trimIndent()

val body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json)
val request = Request.Builder()
        .url(url)
        .post(body)
        .build()
Run Code Online (Sandbox Code Playgroud)

只需将括号中的参数(例如${emailto})传递给您的函数。

如果不想手动构建 json,可以使用Gson库。

data class EmailInfo(
        val emailto: String,
        val emailfrom: String,
        val emailcc: String,
        val emailbcc: String,
        val emailsubject: String,
        val emailtag: String,
        val emailtextbody: String,
        val attachments: List<Attachment>
)

data class EmailRequest(
        val email: EmailInfo
)

...

val emailRequest = EmailRequest(
        email = EmailInfo(
                emailto = "...",
                emailfrom = "...",
                emailcc = "...",
                emailbcc = "...",
                emailsubject = "...",
                emailtag = "...",
                emailtextbody = "...",
                attachments = ...
        )
)

val json = Gson().toJson(emailRequest)

val body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json)
val request = Request.Builder()
        .url(url)
        .post(body)
        .build()
}
Run Code Online (Sandbox Code Playgroud)