A fast data-driven routing library for Clojure/Script
Find a file
Daw-Ran Liou a3c64baeba Change session middleware's default to off
When `:session` key is absent in the route data, the session middleware will not
be attached to the route. To enable the middleware, the user at least need to
use an empty map `{}` for the `:session`, which uses the default options.
2019-10-04 11:00:20 -07:00
.circleci Add step to verify cljdoc.edn as part of CI 2018-10-22 20:46:48 +02:00
dev-resources test perf with different json 2018-08-25 13:28:44 +03:00
doc Merge pull request #259 from metosin/ignore-anchor-click-fn 2019-09-20 10:34:15 +03:00
examples Fix event definitions for routes with parameters 2019-09-09 20:48:26 +03:00
modules Change session middleware's default to off 2019-10-04 11:00:20 -07:00
perf-test/clj/reitit Merge pull request #263 from metosin/north 2019-05-10 14:28:39 +03:00
scripts New reitit-dev module for pretty errors 2019-03-03 20:54:21 +02:00
test Change session middleware's default to off 2019-10-04 11:00:20 -07:00
.gitignore Remove .nrepl-port 2019-10-03 07:30:39 -07:00
book.json initial rework 2018-09-02 19:23:18 +03:00
CHANGELOG.md Update changelog 2019-09-20 11:25:16 +03:00
CONTRIBUTING.md Fix typos 2019-05-22 19:17:10 +02:00
LICENSE Initial commit 2017-08-07 14:15:45 +03:00
package-lock.json Update JS testing dependencies 2019-06-08 14:00:20 +03:00
package.json Update JS testing dependencies 2019-06-08 14:00:20 +03:00
project.clj 0.3.9 2019-06-16 20:20:49 +03:00
README.md 0.3.9 2019-06-16 20:20:49 +03:00

reitit Build Status cljdoc badge

A fast data-driven router for Clojure(Script).

Presentations:

Full Documentation

There is #reitit in Clojurians Slack for discussion & help.

Main Modules

  • reitit - all bundled
  • reitit-core - the routing core
  • reitit-ring - a ring router
  • reitit-middleware - common middleware
  • reitit-spec clojure.spec coercion
  • reitit-schema Schema coercion
  • reitit-swagger Swagger2 apidocs
  • reitit-swagger-ui Integrated Swagger UI
  • reitit-frontend Tools for frontend routing
  • reitit-http http-routing with Interceptors
  • reitit-interceptors - common interceptors
  • reitit-sieppari support for Sieppari
  • reitit-dev - development utilities

Extra modules

Latest version

All main modules bundled:

[metosin/reitit "0.3.9"]

Optionally, the parts can be required separately.

Quick start

(require '[reitit.core :as r])

(def router
  (r/router
    [["/api/ping" ::ping]
     ["/api/orders/:id" ::order]]))

(r/match-by-path router "/api/ping")
; #Match{:template "/api/ping"
;        :data {:name ::ping}
;        :result nil
;        :path-params {}
;        :path "/api/ping"}

(r/match-by-name router ::order {:id 2})
; #Match{:template "/api/orders/:id",
;        :data {:name ::order},
;        :result nil,
;        :path-params {:id 2},
;        :path "/api/orders/2"}

Ring example

A Ring routing app with input & output coercion using data-specs.

(require '[reitit.ring :as ring])
(require '[reitit.coercion.spec])
(require '[reitit.ring.coercion :as rrc])

(def app
  (ring/ring-handler
    (ring/router
      ["/api"
       ["/math" {:get {:parameters {:query {:x int?, :y int?}}
                       :responses {200 {:body {:total pos-int?}}}
                       :handler (fn [{{{:keys [x y]} :query} :parameters}]
                                  {:status 200
                                   :body {:total (+ x y)}})}}]]
      ;; router data effecting all routes
      {:data {:coercion reitit.coercion.spec/coercion
              :middleware [rrc/coerce-exceptions-middleware
                           rrc/coerce-request-middleware
                           rrc/coerce-response-middleware]}})))

Valid request:

(app {:request-method :get
      :uri "/api/math"
      :query-params {:x "1", :y "2"}})
; {:status 200
;  :body {:total 3}}

Invalid request:

(app {:request-method :get
      :uri "/api/math"
      :query-params {:x "1", :y "a"}})
;{:status 400,
; :body {:type :reitit.coercion/request-coercion,
;        :coercion :spec,
;        :spec "(spec-tools.core/spec {:spec (clojure.spec.alpha/keys :req-un [:$spec20745/x :$spec20745/y]), :type :map, :keys #{:y :x}, :keys/req #{:y :x}})",
;        :problems [{:path [:y],
;                    :pred "clojure.core/int?",
;                    :val "a",
;                    :via [:$spec20745/y],
;                    :in [:y]}],
;        :value {:x "1", :y "a"},
;        :in [:request :query-params]}}

More examples

All examples are in https://github.com/metosin/reitit/tree/master/examples

More info

Check out the full documentation!

Join #reitit channel in Clojurians slack.

Roadmap is mostly written in issues.

Special thanks

License

Copyright © 2017-2019 Metosin Oy

Distributed under the Eclipse Public License, the same as Clojure.