mirror of
https://github.com/metosin/reitit.git
synced 2026-02-04 11:23:14 +00:00
commit
2a789557f2
1 changed files with 45 additions and 1 deletions
|
|
@ -405,9 +405,53 @@ All the beer-routes now match in constant time.
|
||||||
|-----------------|---------|-----------------------
|
|-----------------|---------|-----------------------
|
||||||
| `/beers/sahti` | 40ns | static
|
| `/beers/sahti` | 40ns | static
|
||||||
|
|
||||||
|
### Wrapping a swappable ring handler
|
||||||
|
|
||||||
|
In order for a ring handler to be recomposed, we can wrap it into a handler that dereferences it on request.
|
||||||
|
|
||||||
|
```clj
|
||||||
|
(defn deref-handler [rf]
|
||||||
|
(fn
|
||||||
|
([request] (@rf request))
|
||||||
|
([request respond raise] (@rf request respond raise))))
|
||||||
|
```
|
||||||
|
|
||||||
|
A simplified beer router version that creates a ring-handler.
|
||||||
|
|
||||||
|
```clj
|
||||||
|
(defn create-ring-handler [beers]
|
||||||
|
(ring/ring-handler
|
||||||
|
(ring/router
|
||||||
|
[["/beers"
|
||||||
|
(when (seq beers)
|
||||||
|
(for [beer beers]
|
||||||
|
[(str "/" beer)
|
||||||
|
{:get (fn [_] {:status 200 :body beer})}]))]])))
|
||||||
|
|
||||||
|
(def ring-handler
|
||||||
|
(atom (create-ring-handler nil)))
|
||||||
|
|
||||||
|
(defn reset-router! [beers]
|
||||||
|
(reset! ring-handler (create-ring-handler beers)))
|
||||||
|
```
|
||||||
|
|
||||||
|
We don't have any matching routes yet.
|
||||||
|
|
||||||
|
```clj
|
||||||
|
((deref-handler ring-handler) {:request-method :get :uri "/beers/lager"})
|
||||||
|
; nil
|
||||||
|
```
|
||||||
|
|
||||||
|
But we can add them later.
|
||||||
|
|
||||||
|
```clj
|
||||||
|
(reset-router! ["lager"])
|
||||||
|
((deref-handler ring-handler) {:request-method :get :uri "/beers/lager"})
|
||||||
|
; {:status 200, :body "lager"}
|
||||||
|
```
|
||||||
|
|
||||||
## TODO
|
## TODO
|
||||||
|
|
||||||
* add an example how to do dynamic routing with `reitit-ring`
|
|
||||||
* maybe create a `recursive-router` into a separate ns with all `Router` functions implemented correctly? maybe not...
|
* maybe create a `recursive-router` into a separate ns with all `Router` functions implemented correctly? maybe not...
|
||||||
* add `reitit.core/merge-routes` to effectively merge routes with route data
|
* add `reitit.core/merge-routes` to effectively merge routes with route data
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue