このようなリクエスト本文を送信したい:
"email":{
"emailto":"[email protected]",
"emailfrom":"[email protected]",
"emailcc":"[email protected]",
"emailbcc":"[email protected]",
"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オブジェクトを取得する場合は、まず、それらを使用する予定のクラスに次の行を追加します。 。
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)