如何使用 ktor kotlin 通过 POST 发送 JSON 字符串?

Posted

技术标签:

【中文标题】如何使用 ktor kotlin 通过 POST 发送 JSON 字符串?【英文标题】:How to send JSON String with POST using ktor kotlin? 【发布时间】:2021-04-18 04:07:53 【问题描述】:

如何使用kotlin和ktor在POST请求中添加JSON字符串?

打印出从文件中读取的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\" 

【问题讨论】:

【参考方案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

【讨论】:

当我做同样重要的事情时,它在分配给“body”时崩溃。我的代码有什么不同? val jsonBody = JSONObject() val response: HttpResponse = httpClient.post(URLAuthenticateProfile) headers append(HttpHeaders.ContentType, "application/json") append(HttpHeaders.CacheControl, "no-cache ") contentType(ContentType.Application.Json) body = jsonBody

以上是关于如何使用 ktor kotlin 通过 POST 发送 JSON 字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用内容协商将 json 转换为 ktor 中的 kotlin 对象?

如何在 Kotlin 的 Ktor 中提取访问权限验证

如何在 Ktor (Kotlin) 中管道的各个部分之间传递数据

如何使用带有 ktor 框架的 graphql-kotlin 进行字段级解析器

如何使用 Ktor 和 Kotlin 下载带有进度指示器的大文件?

Kotlin Multiplatform Mobile:Ktor - 如何在 Kotlin Native(iOS)中取消活动协程(网络请求、后台工作)?