Size: a a a

Kotlin Community

2019 December 19

IS

Ivan Sablin in Kotlin Community
Ребят, кто может объяснить такую особенность ktor
val call = client.post<String> {
           url.takeFrom(getRoute(apiMethod))

           header(AUTHORIZATION_KEY, getAuthHeader(token))

           val obj = JsonObject(mapOf(
               NAME_KEY to JsonPrimitive(name),
               PUBLIC_KEY to JsonPrimitive(publicKey)
           ))

           body = json.stringify(obj)
       }

Используя этот код, сервер говорит, что public key is blank. Но если я меняю на body = serializer.write(obj)
private val serializer = io.ktor.client.features.json.defaultSerializer()

То все чудесным образом взлетает. Смотрю логи http клиента, они индентичны в обоих случаях
D/OkHttp: --> POST https://api.digitalocean.com/v2/account/keys
D/OkHttp: Content-Length: 269
D/OkHttp: Authorization: Bearer b90bac62...
D/OkHttp: Accept: application/json
D/OkHttp: {"name":"My VPN ssh key","public_key":"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDcCAwtGkHM2Buf...
источник

VP

Vladimir Petrakovich in Kotlin Community
Ivan Sablin
Ребят, кто может объяснить такую особенность ktor
val call = client.post<String> {
           url.takeFrom(getRoute(apiMethod))

           header(AUTHORIZATION_KEY, getAuthHeader(token))

           val obj = JsonObject(mapOf(
               NAME_KEY to JsonPrimitive(name),
               PUBLIC_KEY to JsonPrimitive(publicKey)
           ))

           body = json.stringify(obj)
       }

Используя этот код, сервер говорит, что public key is blank. Но если я меняю на body = serializer.write(obj)
private val serializer = io.ktor.client.features.json.defaultSerializer()

То все чудесным образом взлетает. Смотрю логи http клиента, они индентичны в обоих случаях
D/OkHttp: --> POST https://api.digitalocean.com/v2/account/keys
D/OkHttp: Content-Length: 269
D/OkHttp: Authorization: Bearer b90bac62...
D/OkHttp: Accept: application/json
D/OkHttp: {"name":"My VPN ssh key","public_key":"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDcCAwtGkHM2Buf...
Может, дело в заголовке Content-Type?
источник

IS

Ivan Sablin in Kotlin Community
ну он же вроде везде одинаковый
defaultRequest {
               accept(ContentType.Application.Json)
           }
источник

VP

Vladimir Petrakovich in Kotlin Community
Ivan Sablin
ну он же вроде везде одинаковый
defaultRequest {
               accept(ContentType.Application.Json)
           }
Это же Accept
источник

IS

Ivan Sablin in Kotlin Community
ну так то да
источник

IS

Ivan Sablin in Kotlin Community
я помню что морочился с тем, чтобы добавить content type к запросу
источник

IS

Ivan Sablin in Kotlin Community
Но в любом случае как serializer учтанавливает content-type для запроса
источник

VP

Vladimir Petrakovich in Kotlin Community
Ivan Sablin
Но в любом случае как serializer учтанавливает content-type для запроса
А что возвращает serializer.write(obj)?
источник

IS

Ivan Sablin in Kotlin Community
хех ну да, OutgoingContent, и в нем как раз есть ContentType
источник

AO

Alexey Otts in Kotlin Community
Quantum Harmonizer
как ты ещё key set вытащишь?
Я уже как то расказывал как это делал в tethys, берешь короче и склыдываешь отпарсенные токены в очередь до тех пор, пока не найдёшь дескриминатор, а потом начинаешь парсить с начала этой очереди. И получается, что в большой части кейсов дескриминатор будет в самом начале и ничего парсить наперёд не надо
источник

KZ

Konstantin Zolotov in Kotlin Community
О, там на гитхабе 1.4.0-dev уже появился. И 1.3.70 в eap-билды пошли)
источник

VP

Vladimir Petrakovich in Kotlin Community
Konstantin Zolotov
О, там на гитхабе 1.4.0-dev уже появился. И 1.3.70 в eap-билды пошли)
Почти не боян)
https://t.me/kotlin_lang/175922
источник

KZ

Konstantin Zolotov in Kotlin Community
А, ну я слоупок, все нормально тогда)
источник

A

Aleksandr in Kotlin Community
Народ, а как обойти проблему вызова onEach после отмены job: https://github.com/Kotlin/kotlinx.coroutines/issues/1265
источник

VT

Vsevolod Tolstopyatov in Kotlin Community
Вызывать ensureActive
источник

VT

Vsevolod Tolstopyatov in Kotlin Community
отписаться в issue тоже поможет, давно было желание сделать что-то типа flow.checked(), который cancellation на каждый элемент проверяет
источник

A

Aleksandr in Kotlin Community
Vsevolod Tolstopyatov
Вызывать ensureActive
ensureActive не помогает
источник

A

Aleksandr in Kotlin Community
Vsevolod Tolstopyatov
отписаться в issue тоже поможет, давно было желание сделать что-то типа flow.checked(), который cancellation на каждый элемент проверяет
Я плюсик поставил. Дублировать написанное не хочется.
источник

AS

Anthony Styzhin in Kotlin Community
Не ваш случай? https://youtu.be/w0kfnydnFWI
источник

QH

Quantum Harmonizer in Kotlin Community
Alexey Otts
Я уже как то расказывал как это делал в tethys, берешь короче и склыдываешь отпарсенные токены в очередь до тех пор, пока не найдёшь дескриминатор, а потом начинаешь парсить с начала этой очереди. И получается, что в большой части кейсов дескриминатор будет в самом начале и ничего парсить наперёд не надо
Да, я именно так и делаю. Там речь была о том, что делать, если в роли дискриминатора выступает ketSet целиком.
источник