web-dev-qa-db-ja.com

Kotlinのokhttp3RequestBody

このようなリクエスト本文を送信したい:

これをどのように送信しますか?クラスで送りますか?

"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()
5
Ali Ihsan URAL

このような場合は 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()
}
4
hluhovskyi

上記の答えをより明確にするために、これが拡張関数の使用方法です。

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)
5
Devenom