No se pueden montar rutas, aunque se llame la función registerRoute.
Estoy intentando escribir una aplicación Ktor simple. Tengo un archivo llamado ImageRoutes.kt
:
package my.keddad.routes
// algunos imports aquí
fun Route.imageRouting() {
route("/image") {
post {
// alguna lógica aquí
}
}
}
fun Application.registerImageRoutes() {
routing {
imageRouting()
}
}
Quiero montar esas rutas. Para hacerlo, agrego mi función registerImageRoutes()
a la configuración de embeddedServer
. Mi Application.kt
:
package my.keddad
import io.ktor.application.*
import io.ktor.server.engine.*
import io.ktor.server.netty.*
import my.keddad.plugins.*
import my.keddad.routes.registerImageRoutes
fun main() {
embeddedServer(Netty, port = 8080, host = "0.0.0.0") {
configureRouting()
configureHTTP()
configureMonitoring()
configureSerialization()
registerImageRoutes()
}.start(wait = true)
}
Cuando inicio mi código, se llama a la función registerImageRoutes()
, pero aparentemente no se agregan rutas; obtengo errores 404 al intentar usarlas:
2021-12-01 00:45:37.015 [main] INFO ktor.application - Autoreload is disabled because the development mode is off.
2021-12-01 00:45:37.083 [main] INFO ktor.application - Responding at http://0.0.0.0:8080
2021-12-01 00:45:37.083 [main] INFO ktor.application - Application started in 0.079 seconds.
2021-12-01 00:45:37.084 [main] INFO ktor.application - Application started: io.ktor.application.Application@1a677343
2021-12-01 00:45:39.699 [eventLoopGroupProxy-4-1] INFO ktor.application - 404 Not Found: post - /image
La documentación también sugiere agregar mi función de registro de rutas a Application.module
, sin embargo, eso tampoco funciona. ¿Qué estoy haciendo mal?
Así es como se ve mi rastreo:
2021-12-01 10:02:54.375 [eventLoopGroupProxy-4-1] TRACE ktor.application - Trace for [image]
/, segment:0 -> SUCCESS @ /
/image, segment:1 -> SUCCESS @ /image
/image/(method:POST), segment:1 -> FAILURE "Selector didn't match" @ /image/(method:POST)
Matched routes:
No results
Route resolve result:
FAILURE "No matched subtrees found" @ /
No estoy seguro de lo que significa eso. Sabe que hay una ruta /image
registrada, pero no puede encontrar el controlador para POST a esa URI?
De hecho, parece que tiene algo que ver con el tipo de solicitud. Cuando corro pruebas, así:
withTestApplication({ configureRouting() }) {
with(handleRequest(HttpMethod.Post, "/image"){
}
}
Obtengo 404. Cuando uso curl de esta manera:
curl -v -X post http://localhost:8080/image
También obtengo 404. Sin embargo, cuando uso curl con “post” en letras mayúsculas, funciona como se esperaba:
curl -v -X POST http://localhost:8080/image
También estoy confundido por el rastreo, que parece igual al rastreo para solicitudes fallidas (con la excepción de que en realidad encuentra la ruta):
2021-12-01 11:21:33.369 [eventLoopGroupProxy-4-2] TRACE ktor.application - Trace for [image]
/, segment:0 -> SUCCESS @ /
/image, segment:1 -> SUCCESS @ /image
/image/(method:POST), segment:1 -> SUCCESS @ /image/(method:POST)
Matched routes:
"" -> "image" -> "(method:POST)"
Route resolve result:
SUCCESS @ /image/(method:POST)
davy.ai
Parece que el problema que estás experimentando está relacionado con la sensibilidad de mayúsculas y minúsculas del método de solicitud HTTP. Ktor es sensible a las mayúsculas y minúsculas en lo que respecta al método de solicitud HTTP, lo que significa que el método
post
en tu archivoImageRoutes.kt
debería estar en mayúsculas, comoPOST
.Por lo tanto, actualiza tu archivo
ImageRoutes.kt
a:luego intenta llamar a tu ruta nuevamente usando
POST
en lugar depost
. Esto debería solucionar el problema que estás enfrentando.