alex009
08/20/2018, 8:27 AMDeactivated User
08/20/2018, 9:15 AMalex009
08/20/2018, 9:35 AMalex009
08/20/2018, 9:39 AMalex009
08/20/2018, 9:39 AMDeactivated User
08/20/2018, 9:42 AMserializer = KotlinxSerializer()
(serializer as KotlinxSerializer).setWriteMapper(TestRequest::class, requestMapper)
(serializer as KotlinxSerializer).setReadMapper(TestResponse::class, responseMapper)
->
serializer = KotlinxSerializer().apply {
setWriteMapper(TestRequest::class, requestMapper)
setReadMapper(TestResponse::class, responseMapper)
}
Deactivated User
08/20/2018, 9:45 AMDeactivated User
08/20/2018, 9:46 AMalex009
08/20/2018, 9:47 AMalex009
08/20/2018, 9:48 AMDeactivated User
08/20/2018, 9:50 AMDeactivated User
08/20/2018, 9:50 AMalex009
08/20/2018, 9:54 AMDeactivated User
08/20/2018, 10:05 AMalex009
08/20/2018, 10:06 AMDeactivated User
08/20/2018, 10:07 AMapplication/x-www-form-urlencoded
But the body is a json
(from the image)Deactivated User
08/20/2018, 10:07 AMDeactivated User
08/20/2018, 10:07 AMDeactivated User
08/20/2018, 10:08 AMalex009
08/20/2018, 10:08 AMDeactivated User
08/20/2018, 10:09 AMDeactivated User
08/20/2018, 10:10 AMalex009
08/20/2018, 10:10 AMDeactivated User
08/20/2018, 10:10 AMDeactivated User
08/20/2018, 10:11 AMDeactivated User
08/20/2018, 10:12 AMAndrey Kormak [IceRock]
08/20/2018, 10:14 AMDeactivated User
08/20/2018, 10:15 AMAndrey Kormak [IceRock]
08/20/2018, 10:17 AMDeactivated User
08/20/2018, 10:22 AMobject Json {
@PublishedApi
internal val objectMapper = jacksonObjectMapper()
fun <T> convert(value: Any?, clazz: Class<T>): T = objectMapper.convertValue(value, clazz)
fun <T> parse(str: String, clazz: Class<T>): T = objectMapper.readValue(str, clazz)
fun <T> stringify(value: T): String = objectMapper.writeValueAsString(value)
}
<http://client.post|client.post><String> {
body = TextContent(Json.stringify(...yourobject.,,), ContentType.Application.Json)
contentType(ContentType.Any)
}
Andrey Kormak [IceRock]
08/20/2018, 10:25 AMAndrey Kormak [IceRock]
08/20/2018, 10:42 AMDeactivated User
08/20/2018, 10:46 AMcompile "io.ktor:ktor-jackson:$ktor_version"
Andrey Kormak [IceRock]
08/20/2018, 11:11 AMDeactivated User
08/20/2018, 11:12 AMDeactivated User
08/20/2018, 11:12 AMDeactivated User
08/20/2018, 11:12 AMDeactivated User
08/20/2018, 11:12 AMDeactivated User
08/20/2018, 11:13 AMalex009
08/20/2018, 3:16 PMcontentType(ContentType.Application.Json)
accept(ContentType.Application.Json)
body = TextContent(reqBody, ContentType.Application.Json)
and now request complete success.
so serializer of kotlinxserialization is bugged, yes?alex009
08/20/2018, 3:17 PMDeactivated User
08/20/2018, 5:53 PMalex009
08/20/2018, 11:59 PMalex009
08/21/2018, 12:01 AMalex009
08/21/2018, 12:04 AMalex009
08/21/2018, 12:20 AMTextContent
, and JsonFeature expect what contentType from TextContent
should be set as header, but it not set. our changed code is work because we set content type by call
contentType(ContentType.Application.Json)
but JsonFeature remove this header in interceptor and not set header after it...alex009
08/21/2018, 12:34 AMval contentLength = headers[HttpHeaders.ContentLength] ?: content.contentLength?.toString()
val contentType = headers[HttpHeaders.ContentType] ?: content.contentType?.toString()
contentLength?.let { builder.headerLine(HttpHeaders.ContentLength, it)}
contentType?.let { builder.headerLine(HttpHeaders.ContentType, it)}
but in android i see:
private suspend fun AndroidHttpRequest.execute(): AndroidHttpResponse {
val requestTime = GMTDate()
val url = URLBuilder().takeFrom(url).buildString()
val contentLength = headers[HttpHeaders.ContentLength]?.toLong() ?: content.contentLength
val context = Job()
val connection = (URL(url).openConnection() as HttpURLConnection).apply {
connectTimeout = config.connectTimeout
readTimeout = config.socketTimeout
requestMethod = method.value
useCaches = false
instanceFollowRedirects = false
headers.forEach { key, value ->
addRequestProperty(key, value.joinToString(";"))
}
if (this@execute.content !is OutgoingContent.NoContent) {
if (contentLength != null) {
addRequestProperty(HttpHeaders.ContentLength, contentLength.toString())
} else {
addRequestProperty(HttpHeaders.TransferEncoding, "chunked")
}
contentLength?.let { setFixedLengthStreamingMode(it) } ?: setChunkedStreamingMode(0)
doOutput = true
this@execute.content.writeTo(outputStream)
}
}
connection.connect()
val content = connection.content(dispatcher)
val headerFields = connection.headerFields
val responseHeaders = HeadersBuilder().apply {
headerFields?.forEach { (key, values) -> key?.let { appendAll(it, values) } }
}.build()
return AndroidHttpResponse(
call, content, context,
responseHeaders, requestTime, GMTDate(),
HttpStatusCode.fromValue(connection.responseCode), HttpProtocolVersion.HTTP_1_1,
connection
)
}
contentLength was set, but content-type - not.alex009
08/21/2018, 12:35 AMalex009
08/21/2018, 12:36 AMalex009
08/21/2018, 12:36 AMDeactivated User
08/21/2018, 7:41 AM@Deprecated("")
and autogenerate the replaceWith with idea, so it gets replaced without you having to do it manually