Routage avec Compojure
Apprenez à définir des routes web et à associer les requêtes entrantes à des fonctions de traitement spécifiques avec Compojure
Routage avec Compojure est une leçon Clojure Functional Programming & JVM Backend Development gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Clojure Functional Programming & JVM Backend Development, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Clojure Functional Programming & JVM Backend Development comprend 4 leçons au total.
Certaines parties de cette leçon n'ont pas encore été traduites et s'affichent en anglais.
What is Web Routing?
When you type a URL into your browser, how does a web application know which part of its code to run?
This is where routing comes in! Routing is the process of mapping incoming web requests (like visiting a URL) to specific functions or pieces of code that handle them.
- It directs traffic.
- It organizes your application.
- It makes URLs meaningful.
Introducing Compojure
Compojure is a popular routing library for Clojure web applications. It builds on top of Ring, Clojure's web application specification.
Compojure provides simple macros to define routes, making it easy to connect URLs to your handler functions. It helps keep your web application's structure clean and understandable.
Defining a Simple GET Route
Compojure uses macros like GET, POST, PUT, and DELETE to define routes for different HTTP methods. The simplest is GET for fetching data.
Here's how you define a route that responds to requests at the root path /:
(ns my-app.routes
(:require [compojure.core :refer [defroutes GET]]))
(defroutes app-routes
(GET "/" [] "Welcome to Compojure!"))Running a Compojure Application
To make our routes active, we need a web server. We'll use http-kit, a simple and fast server. We wrap our app-routes in a function and start the server.
Try running this complete example. Then open your browser to http://localhost:3000!
(ns my-app.core
(:require [compojure.core :refer [defroutes GET]]
[org.httpkit.server :refer [run-server]]))
(defroutes app-routes
(GET "/" [] "Hello from Compojure!"))
(defn -main [& args]
(println "Starting server on port 3000...")
(run-server app-routes {:port 3000}))
(-main)Capturing Path Parameters
Often, you need to extract dynamic parts from a URL, like an item ID or a username. Compojure lets you do this using path parameters, denoted by a colon (:) followed by the parameter name.
These parameters are then available within your handler function as arguments.
(ns my-app.routes
(:require [compojure.core :refer [defroutes GET]]))
(defroutes user-routes
(GET "/users/:id" [id]
(str "Fetching user: " id))
(GET "/products/:name" [name]
(str "Product details for: " name)))Handling Different HTTP Methods
Web applications don't just fetch data (GET). They also create (POST), update (PUT), and delete (DELETE) resources. Compojure provides specific macros for each.
You can define different behaviors for the same URL path based on the HTTP method used.
(ns my-app.methods
(:require [compojure.core :refer [defroutes GET POST PUT DELETE]]))
(defroutes item-api
(GET "/items/:id" [id] (str "Get item " id))
(POST "/items" [] "Create a new item")
(PUT "/items/:id" [id] (str "Update item " id))
(DELETE "/items/:id" [id] (str "Delete item " id)))Grouping Routes with `routes`
As your application grows, you'll have many routes. Compojure's routes macro lets you group them logically. This makes your routing definition more organized and readable.
You can then combine these grouped routes into your main application handler.
(ns my-app.groups
(:require [compojure.core :refer [defroutes GET POST routes]]))
(def user-routes
(routes
(GET "/users" [] "List all users")
(POST "/users" [] "Create a user")))
(def product-routes
(routes
(GET "/products" [] "List products")
(GET "/products/:id" [id] (str "Product details for " id))))
(defroutes main-app
user-routes
product-routes
(GET "/" [] "Homepage"))Nesting Routes for Structure
For even better organization, especially with API versions or sub-sections, you can nest routes. Compojure allows you to define a common path prefix for a group of routes using context.
This creates a clear hierarchy for your application's endpoints, like /api/v1/users or /admin/dashboard.
(ns my-app.nested
(:require [compojure.core :refer [defroutes GET context]]))
(defroutes api-v1-routes
(context "/api/v1" []
(GET "/users" [] "API v1: List users")
(GET "/products" [] "API v1: List products")))
(defroutes admin-routes
(context "/admin" []
(GET "/dashboard" [] "Admin Dashboard")
(GET "/settings" [] "Admin Settings")))
(defroutes all-app-routes
api-v1-routes
admin-routes
(GET "/" [] "Main site"))Route Matching Order Matters
Compojure processes routes in the order they are defined. The first route that matches an incoming request's path and HTTP method will be used.
- Define more specific routes BEFORE general ones.
- For example,
/users/newshould come before/users/:id.
Otherwise, /users/new might be incorrectly matched by /users/:id, with 'new' being treated as an ID.
Quick Check: Compojure Routes
Consider the following Compojure route definitions:
(defroutes my-app
(GET "/products/latest" [] "Latest Products")
(GET "/products/:id" [id] (str "Product ID: " id))
(GET "/" [] "Homepage"))Which of the following statements are TRUE about these routes?
Recap: Routing with Compojure
In this lesson, you've learned the essentials of web routing and how Compojure simplifies it for Clojure applications:
- Routing maps URLs to handler functions.
- Compojure provides macros (
GET,POST, etc.) to define routes. - You can capture path parameters like
:id. - Routes can be grouped with
routesand nested withcontext. - Order matters: specific routes must come before general ones.
You're now ready to define clear, organized routes for your Clojure web services!
Questions Fréquemment Posées
La leçon « Routage avec Compojure » est-elle gratuite ?
Oui — le texte complet de « Routage avec Compojure » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Clojure Functional Programming & JVM Backend Development, passe à CoddyKit PRO. Le cours Clojure Functional Programming & JVM Backend Development comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Routage avec Compojure » ?
Apprenez à définir des routes web et à associer les requêtes entrantes à des fonctions de traitement spécifiques avec Compojure Tu pratiques Clojure Functional Programming & JVM Backend Development avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Clojure Functional Programming & JVM Backend Development ?
Aucune expérience préalable n'est requise. Clojure Functional Programming & JVM Backend Development sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « Routage avec Compojure » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Clojure Functional Programming & JVM Backend Development ?
Oui. Chaque leçon Clojure Functional Programming & JVM Backend Development inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Introduction à Ring et aux bases de HTTP
- Routage avec Compojure
- Gestion des requêtes et des réponses
- Les intergiciels Ring en profondeur