为什么 Ktor Post 请求冻结应用程序,但 Get 不冻结它?

Why Ktor Post Request freeze app, but Get doesn't freeze it?

suspend fun main(args: Array<String>) {
    val client = HttpClient(CIO)
    embeddedServer(Netty, 6001) {
        routing {
            get("/") {
                println(call.request.toLogString())
                call.respondText("Please use POST method", status = HttpStatusCode.BadRequest)
            }
            post("/") {
                call.respondText("{}")
                val params = call.receiveText()
                println(params)
                delay(200)
                println("pre response")
                val response2: HttpResponse = client.post("https://google.com")
                println(response2.status)
                val response: HttpResponse = client.post("https://discord.com/api/webhooks/discord/webhookurl") {
                    body = "{\"content\": \"$params\"}"
                }
                println("after")
                println("response: ${response.receive<String>()}")
            }
        }
    }.start(true)
}

此代码打印到控制台:

{"test":"test"}
pre response

应用冻结。 如果我尝试向 google 或 discord 发送 GET 请求,这会起作用并且不会冻结。 为什么?

Post 请求 google.com 抛出异常:

client.post("https://google.com")

如果您在日志中看到此警告:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

那么你应该添加 slf4j 依赖到你的项目以启用日志记录:

implementation("org.slf4j:slf4j-simple:(version)")

之后您将在服务器日志中看到错误的完整堆栈跟踪:

[eventLoopGroupProxy-4-1] ERROR ktor.application - Unhandled: POST - /
    io.ktor.client.features.ClientRequestException:
        Client request(https://google.com/) invalid: 405 Method Not Allowed.
        ...
        ...