Как отправить строку JSON с помощью POST с помощью ktor kotlin?

Как добавить строку JSON в запрос POST с помощью kotlin и ktor?

При выводе строки Json, прочитанной из файла, или даже созданной строки с помощью Kotlin в клиенте, содержимое выглядит как JSON.

Тем не менее сервер не может распознать строку как JSON, и когда я печатаю ее на сервере, каждая двойная квота обрезается обратно.

Очевидно, что клиент добавляет обратную косую черту, поэтому запрос не отформатирован должным образом.

Клиент Kotlin - Код Ktor:

import com.google.gson.*
import io.ktor.client.*
import io.ktor.http.*

...
val client = HttpClient(OkHttp) {
   
    install(JsonFeature) {
        serializer = GsonSerializer()
    }

}
val fileContent = MyClass::class.java.getResource("myfile").readText()
println("fileContent string = $fileContent")


val out = client.post<String> {
    url(url)
    contentType(ContentType.Application.Json)
    body =  fileContent
}

распечатка выглядит так:

{ "name": "myname", "value": "myvalue" }

но сервер (кстати, я использую hookbin, чтобы распечатать данные без преобразований Джексона) распечатывает:

{ \"name\": \"myname\", \"value\": \"myvalue\" }

person Andreas Panagiotidis    schedule 13.01.2021    source источник


Ответы (1)


Решение состоит в том, чтобы передать в HTTP-запрос POST объект JSON, а не объект String. Они выглядят одинаково, когда вы их распечатываете, но, конечно, они не одинаково интерпретируются JVM. Итак, нам осталось только разобрать строку. Использую библиотеку GSON. Добавьте метод JsonParser - ›parseString и используйте его объект в клиенте:

import com.google.gson.JsonParser    

val fileContent = MyClass::class.java.getResource("myfile").readText()
println("fileContent string = $fileContent")

var bodyAsJsonObject = JsonParser.parseString(fileContent).asJsonObject

println("bodyAsJsonObject = $bodyAsJsonObject")

val out = client.post<String> {
    url(url)
    contentType(ContentType.Application.Json)
    body =  bodyAsJsonObject
}
person Andreas Panagiotidis    schedule 13.01.2021