繁体   English   中英

在Kotlin的okhttp3 RequestBody

[英]okhttp3 RequestBody in Kotlin

我想发送一个这样的请求体:

我怎么发这个? 我会把它作为一个班级发送出去?

"email":{
    "emailto":"foo@bar.com",
    "emailfrom":"foo@bar.com",
    "emailcc":"foo@bar.com",
    "emailbcc":"foo@bar.com",
    "emailsubject":"Subject",
    "emailtag":"Information",
    "emailtextbody":"---",
    "attachments":[]
}

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()

我强烈建议在这种情况下使用Retofit ,但如果你真的需要处理原始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()

只需将括号中的参数(例如${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()
}

为了更清楚地说明上面给出的答案,您可以使用扩展功能。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM