为什么 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.
...
...
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.
...
...