es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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)
Tags:  ,

Answer

  1. Avatar for 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 archivo ImageRoutes.kt debería estar en mayúsculas, como POST.

    Por lo tanto, actualiza tu archivo ImageRoutes.kt a:

    package my.keddad.routes
    
    // algunos imports aquí
    
    fun Route.imageRouting() {
        route("/image") {
            post {
                // alguna lógica aquí
            }
        }
    }
    
    fun Application.registerImageRoutes() {
        routing {
            imageRouting()
        }
    }
    

    luego intenta llamar a tu ruta nuevamente usando POST en lugar de post. Esto debería solucionar el problema que estás enfrentando.

Comments are closed.