En la Parte 4 de Servidores Web desde Cero explicamos cmo extender nuestro enrutador para soportar rutas dinmicas con parmetros en la URL, por ejemplo para manejar peticiones como /api/users/123 sin tener que registrar una ruta por cada id posible.

Resumen de lo que ya tenamos: un servidor HTTP limpio, un enrutador que registra rutas por mtodo y soporta coincidencias exactas como /users o /products. El problema es que las rutas estticas no escalan: no podemos registrar manualmente /users/1, /users/2, /users/3 para atender cualquier id.

La solucin es admitir patrones de ruta con parmetros, por ejemplo /users/:id. Primero implementamos la deteccin de patrones en la funcin resolveRoute para buscar coincidencias por patrn cuando no hay una ruta exacta. La idea principal es dividir la ruta solicitada y cada patrn registrada en segmentos separados por slash y comparar segmento por segmento: si el segmento del patrn empieza por dos puntos entonces es un parmetro y acepta cualquier valor, si no debe coincidir exactamente.

Esquema de la lgica en resolveRoute: obtener method y path de la peticin, intentar coincidencia exacta, y si falla dividir path en segmentos y recorrer las rutas registradas del mismo mtodo; para cada patrn dividir en segmentos, comprobar que el nmero de segmentos coincide y usar una funcin matchesPattern que recorre segmentos comparando valores literales y aceptando segmentos que empiezan por dos puntos como parmetros.

Funcin matchesPattern explicada: recorre los segmentos del patrn. Si el segmento empieza por dos puntos se trata como parmetro y siempre coincide. Si no, compara igualdad estricta con el segmento correspondiente de la ruta solicitada. Si todos los segmentos coinciden o son parmetros, la ruta es apta.

Ejemplo conceptual: para la peticin /users/123 obtenemos pathSegments igual a users, 123. Las rutas registradas para GET pueden incluir users/:id, products/:id, hello. La comprobacin de longitud filtra hello. Luego matchesPattern con users/:id devuelve verdadero porque el primer segmento coincide y el segundo es parmetro, mientras que products/:id falla en el primer segmento.

Una vez detectada la coincidencia por patrn necesitamos extraer los valores reales de los parmetros y ponerlos a disposicin del handler. Para ello se implementa extractParams que recorre los segmentos del patrn y cuando encuentra uno que empieza por dos puntos extrae el nombre del parmetro sin el prefijo dos puntos y lo asocia con el valor del segmento correspondiente de la ruta solicitada. Por ejemplo con patrn users/:id y ruta users/123 extractParams devuelve un mapa con id -> 123.

Para que los handlers puedan acceder a esos valores almacenamos el mapa de parmetros en el contexto de la peticin usando context.WithValue y retornamos el handler encontrado. A continuacin se puede crear una funcin auxiliar GetPathValue que lee el contexto y devuelve el valor del parmetro solicitado por clave.

Actualizacin del handler de usuarios: ahora el handler puede llamar a GetPathValue para obtener id, convertirlo a entero y buscar en el slice de datos del servidor el usuario correspondiente. Si el id no es nmero correcto se responde con un estado Bad Request y un error; si no existe el usuario se responde con Not Found; cuando todo va bien se responde con un objeto JSON con la informacin del usuario.

Pruebas: con esta implementacin peticiones como /users/1, /users/2, /users/4 o incluso /users/anything coinciden con el patrn /users/:id. Si el valor no es un entero o el usuario no existe devolvemos mensajes de error adecuados. La solucion soporta tambin patrn ms complejos como /products/:category/:id con varios parmetros anidados.

Que hemos logrado: coincidencia de patrones en rutas con parmetros, extraccin de valores de URL, exposicin de parmetros al handler mediante contexto, enrutamiento dinmico que funciona con cualquier id y manejo de errores para ids invlidos o recursos no encontrados.

Siguiente paso propuesto: en el siguiente capitulo nos centraremos en extraer datos desde la peticin misma, por ejemplo cuerpo JSON, cabeceras y query params, y combinar esa informacin con los parmetros de ruta para crear endpoints robustos.

Reto: intenta crear un patrn /products/:category/:id y un handler que use ambos parmetros para filtrar productos por categora e id y devuelve el resultado o un error adecuado si no existe.

Sobre Q2BSTUDIO: somos Q2BSTUDIO, empresa de desarrollo de software que ofrece aplicaciones a medida y software a medida para empresas de todos los tamaños. Nos especializamos en inteligencia artificial, ia para empresas y agentes IA, as como en ciberseguridad y servicios de pentesting para proteger infraestructuras y aplicaciones. Tambin ofrecemos servicios cloud AWS y Azure y soluciones de inteligencia de negocio y Power BI para transformar datos en decisiones. Si necesitas una aplicacin a medida podemos ayudarte; consulta nuestras soluciones de desarrollo en desarrollo de aplicaciones y software multiplataforma y conoce nuestras ofertas de inteligencia artificial en servicios de inteligencia artificial para empresas. Trabajamos tambi n en automatizacin de procesos, integraciones cloud y dashboards de business intelligence para que tus equipos tomen decisiones ms rpidas y seguras.

Palabras clave integradas naturalmente: aplicaciones a medida, software a medida, inteligencia artificial, ciberseguridad, servicios cloud aws y azure, servicios inteligencia de negocio, ia para empresas, agentes IA, power bi. Si quieres contactarnos para un proyecto de software a medida, migracin a cloud, auditoria de seguridad o iniciativa de inteligencia artificial, en Q2BSTUDIO tenemos la experiencia para llevarlo a cabo y asesorarte en cada paso.

Nota final: este enfoque de enrutamiento es sencillo y fsico para aplicaciones de ejemplo y prototipos. En produccin es recomendable considerar estructuras de datos ms eficientes para la bqueda de rutas y libreras maduras que ya implementan enrutamiento de alto rendimiento, extraccin de parmetros y validaciones adicionales.