A fast data-driven routing library for Clojure/Script
Find a file
Audrius 02004cac8d
Fix Ring example
Maybe it is not perfect solution but at least it works. It was somewhat weird that the front page of the lib contains non working examples.
2021-04-22 09:27:07 +03:00
.clj-kondo Add clj-kondo and fix most linting warnings 2020-03-05 13:32:48 +02:00
.github/workflows Start using GitHub Actions 2021-02-17 16:22:01 +02:00
dev-resources test perf with different json 2018-08-25 13:28:44 +03:00
doc Update README.md 2021-04-12 13:39:15 +10:00
examples 0.5.12 2021-02-04 20:40:25 +02:00
modules Update swagger_ui.cljc 2021-03-11 08:41:31 -05:00
perf-test/clj/reitit Faster path conflict resolution, O(n2) -> O(n) 2020-04-27 08:38:27 +03:00
scripts Better set-version 2020-05-16 18:11:13 +03:00
test Make the not-found-handler fix backwards compatible 2021-02-26 08:14:01 +02:00
.gitignore update deps 2020-09-26 12:11:14 +03:00
book.json initial rework 2018-09-02 19:23:18 +03:00
CHANGELOG.md malli 0.3.0 2021-03-02 21:25:02 +02:00
CONTRIBUTING.md Fix typos 2019-05-22 19:17:10 +02:00
Justfile Add clj-kondo and fix most linting warnings 2020-03-05 13:32:48 +02:00
LICENSE Initial commit 2017-08-07 14:15:45 +03:00
lint.sh Add clj-kondo and fix most linting warnings 2020-03-05 13:32:48 +02: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 malli 0.3.0 2021-03-02 21:25:02 +02:00
README.md Fix Ring example 2021-04-22 09:27:07 +03:00

reitit Build Status cljdoc badge Slack

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-malli malli 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.5.12"]

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 '[muuntaja.core :as m])
(require '[reitit.ring :as ring])
(require '[reitit.coercion.spec])
(require '[reitit.ring.coercion :as rrc])
(require '[reitit.ring.middleware.muuntaja :as muuntaja])
(require '[reitit.ring.middleware.parameters :as parameters])

(def app
  (ring/ring-handler
    (ring/router
      ["/api"
       ["/math" {:get {:parameters {:query {:x int?, :y int?}}
                       :responses  {200 {:body {:total int?}}}
                       :handler    (fn [{{{:keys [x y]} :query} :parameters}]
                                     {:status 200
                                      :body   {:total (+ x y)}})}}]]
      ;; router data affecting all routes
      {:data {:coercion   reitit.coercion.spec/coercion
              :muuntaja   m/instance
              :middleware [parameters/parameters-middleware
                           rrc/coerce-request-middleware
                           muuntaja/format-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

External resources

More info

Check out the full documentation!

Join #reitit channel in Clojurians slack.

Roadmap is mostly written in issues.

Special thanks

License

Copyright © 2017-2021 Metosin Oy

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