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