A fast data-driven routing library for Clojure/Script
Find a file
Aaron Groom ac19264b83
Remove unused compojure dependencies from frontend examples
These don't appear to be needed and might cause users to introduce
dependencies into their projects if they use as templates in their own
projects.
2019-04-02 15:40:09 -04: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 Mention browser history stack manipulation in docs 2019-03-22 08:42:28 +02:00
examples Remove unused compojure dependencies from frontend examples 2019-04-02 15:40:09 -04:00
modules 0.3.1 2019-03-18 08:27:25 +02:00
perf-test/clj/reitit 20% faster wildcard parameters with records 2019-03-07 08:20:41 +02:00
scripts New reitit-dev module for pretty errors 2019-03-03 20:54:21 +02:00
test 20% faster wildcard parameters with records 2019-03-07 08:20:41 +02:00
.gitignore Create example 2018-07-12 12:46:41 +03:00
book.json initial rework 2018-09-02 19:23:18 +03:00
CHANGELOG.md 0.3.1 2019-03-18 08:27:25 +02:00
CONTRIBUTING.md Update CONTRIBUTING.md 2019-03-08 15:09:09 +02:00
LICENSE Initial commit 2017-08-07 14:15:45 +03:00
package-lock.json Run CLJS tests in Circle 2018-03-13 14:47:04 +02:00
package.json Run CLJS tests in Circle 2018-03-13 14:47:04 +02:00
project.clj Remove --release option as it fails the cljs build 2019-03-18 08:58:25 +02:00
README.md Add more thanks in README 2019-03-18 10:52:13 +02:00

reitit Build Status cljdoc badge

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

Posts:

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.1"]

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.