Kotlin 中的 okhttp3 RequestBody
okhttp3 RequestBody in Kotlin
我想发送这样的请求正文:
如何发送?我会将其作为 class ?
发送
"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
创建 MediaType 和 RequestBody 对象的旧方法已被弃用并且不能在 Kotlin.
中使用
如果您想使用扩展函数从字符串中获取 MediaType 对象和 ResponseBody 对象,首先添加以下内容您希望在其中使用它们的 class 行。
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)
我想发送这样的请求正文:
如何发送?我会将其作为 class ?
发送"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
创建 MediaType 和 RequestBody 对象的旧方法已被弃用并且不能在 Kotlin.
如果您想使用扩展函数从字符串中获取 MediaType 对象和 ResponseBody 对象,首先添加以下内容您希望在其中使用它们的 class 行。
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)