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
submitFormWithBinaryData
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).SerializationException
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 itappend(key = "messageId",value = messageId)
in formData
works for me
thank you very much)