Evgeny Berezovsky
09/05/2021, 10:22 PMdefaultRequest
uses header(HttpHeaders.ContentType, ContentType.Application.Json)
When sending via submitFormWithBinaryData
, it returns the error kotlinx. serialization. SerializationException: Serializer for class 'MultipartFormDataContent' is not found
I tried to change header
for the request to send an image with contentType
, but I get another error io.ktor. http.UnsafeHeaderException: Header(s) [Content-Type] are controlled by the engine and cannot be set explicitly
Judging by https://youtrack.jetbrains.com/issue/KTOR-620, I can't do this
Setting contentType
for MultipartFormDataContent
does not give anything
How can I send a request with a serializable class of type AddImageToMessage (val messageId: Int)
and attach an image to this request?edenman
09/05/2021, 10:31 PMbody
edenman
09/05/2021, 10:33 PMsubmitFormWithBinaryData
looks like it sets the body
for you, would need to see what your block is doingEvgeny Berezovsky
09/05/2021, 11:16 PMdefaultRequest
is set in header(HttpHeaders.ContentType, ContentType.Application.Json)
I get an error kotlinx. serialization. SerializationException: Serializer for class 'MultipartFormDataContent' is not found
client settings
fun getClient(): HttpClient {
return HttpClient(CIO) {
install(JsonFeature) {
serializer = KotlinxSerializer(
Json {
prettyPrint = true
isLenient = true
ignoreUnknownKeys = true
coerceInputValues = true
}
)
}
expectSuccess = false
defaultRequest {
host = BuildConfig.REST_API_ADDRESS
url.protocol = URLProtocol.HTTPS
header(HttpHeaders.ContentType, ContentType.Application.Json)
}
}
}
request
suspend fun addImageToMessage(
messageId: Int,
path: String,
image: File
) {
client.submitFormWithBinaryData<Unit>(
formData = formData {
append(
"image", image.readBytes(), Headers.build {
append(HttpHeaders.ContentType, "image/png")
append(HttpHeaders.ContentDisposition, "filename=image.png")
}
)
// append("messageId", messageId)
}
) {
url.encodedPath = path
// body = AddImageToMessage(messageId = messageId)
}
}
I would also like to add AddImageToMessage
to this request
append("messageId", messageId)
does not work in my caseAleksei Tirman [JB]
09/06/2021, 10:20 AMapplication/json
content-type in the defaultRequest
because this header triggers content converter execution (UnsafeHeaderException
is not thrown because because ContentNegotiation
removes this header before the check).Aleksei Tirman [JB]
09/06/2021, 10:23 AMSerializationException
is expectable and to avoid it you should not put the application/json
content-type in the first place.Evgeny Berezovsky
09/06/2021, 12:34 PMmessageId
parameter to the request body
as if I sent them through the serializable AddImageToMessage
class
most likely, this should be added to the formData
, but I do not know howAleksei Tirman [JB]
09/06/2021, 1:11 PMEvgeny Berezovsky
09/06/2021, 1:25 PMkey
parameter?
suspend fun addImageToMessage(
messageId: Int,
path: String,
image: File
) {
client.submitFormWithBinaryData<Unit>(
formData = formData {
append(
"image", image.readBytes(), Headers.build {
append(HttpHeaders.ContentType, "image/png")
append(HttpHeaders.ContentDisposition, "filename=image.png")
}
)
val messageIdJson = JSONObject().apply {
put("messageId", messageId)
}
append(key = "?",value = messageIdJson.toString())
}
) {
url.encodedPath = path
}
}
Aleksei Tirman [JB]
09/06/2021, 6:22 PMEvgeny Berezovsky
09/06/2021, 8:00 PMmessageId
with ContentType=application/json
without an attached image, then in the logs it will look like this
but when I attach an image and change ContentType=multipart/form-data
, I do not know how to add information about the messageId
so that the server sees itEvgeny Berezovsky
09/06/2021, 11:40 PMappend(key = "messageId",value = messageId)
in formData
works for me
thank you very much)