reitit/doc/basics/route_syntax.md

132 lines
2.8 KiB
Markdown
Raw Normal View History

2017-10-29 07:29:06 +00:00
# Route Syntax
Routes are defined as vectors of String path and optional (non-sequential) route argument child routes.
Routes can be wrapped in vectors and lists and `nil` routes are ignored.
2019-02-10 10:43:00 +00:00
Paths can have path-parameters (`:id`) or catch-all-parameters (`*path`). Since `0.4.0`, parameters can also be wrapped in brackets, enabling use of qualified keywords `{user/id}`, `{*user/path}`. The non-bracket syntax might be deprecated later.
### Examples
2017-10-29 07:29:06 +00:00
Simple route:
```clj
["/ping"]
```
Two routes:
```clj
[["/ping"]
["/pong"]]
```
Routes with route arguments:
```clj
[["/ping" ::ping]
["/pong" {:name ::pong}]]
```
Routes with path parameters:
```clj
[["/users/:user-id"]
["/api/:version/ping"]]
```
2019-02-10 10:43:00 +00:00
```clj
[["/users/{user-id}"]
["/files/file-{number}.pdf"]]
```
2017-10-29 07:29:06 +00:00
Route with catch-all parameter:
```clj
["/public/*path"]
```
2019-02-10 10:43:00 +00:00
```clj
["/public/{*path}"]
```
2017-10-29 07:29:06 +00:00
Nested routes:
```clj
["/api"
["/admin" {:middleware [::admin]}
["" ::admin]
["/db" ::db]]
["/ping" ::ping]]
```
Same routes flattened:
```clj
[["/api/admin" {:middleware [::admin], :name ::admin}]
["/api/admin/db" {:middleware [::admin], :name ::db}]
["/api/ping" {:name ::ping}]]
```
2019-02-10 10:43:00 +00:00
### Encoding
Reitit does not apply any encoding to your paths. If you need that, you must encode them yourself. E.g., `/foo bar` should be `/foo%20bar`.
### Wildcards
Normal path-parameters (`:id`) can start anywhere in the path string, but have to end either to slash `/` (currently hardcoded) or to en end of path string:
```clj
[["/api/:version"]
["/files/file-:number"]
["/user/:user-id/orders"]]
```
Bracket path-parameters can start and stop anywhere in the path-string, the following character is used as a terminator.
```clj
[["/api/{version}"]
["/files/{name}.{extension}"]
["/user/{user-id}/orders"]]
```
Having multiple terminators after a bracket path-path parameter with identical path prefix will cause a compile-time error at router creation:
```clj
[["/files/file-{name}.pdf"] ;; terminator \.
["/files/file-{name}-{version}.pdf"]] ;; terminator \-
```
### Slash Free Routing
```clj
[["broker.{customer}.{device}.{*data}"]
["events.{target}.{type}"]]
```
### Generating routes
2018-02-11 17:15:25 +00:00
Routes are just data, so it's easy to create them programmatically:
2017-10-29 07:29:06 +00:00
```clj
2018-02-11 17:15:25 +00:00
(defn cqrs-routes [actions]
2017-10-29 07:29:06 +00:00
["/api" {:interceptors [::api ::db]}
(for [[type interceptor] actions
:let [path (str "/" (name interceptor))
2019-02-10 10:43:00 +00:00
method (case type
2017-10-29 07:29:06 +00:00
:query :get
:command :post)]]
2018-02-11 17:15:25 +00:00
[path {method {:interceptors [interceptor]}}])])
2017-10-29 07:29:06 +00:00
```
```clj
(cqrs-routes
[[:query 'get-user]
[:command 'add-user]
2018-02-11 17:15:25 +00:00
[:command 'add-order]])
2017-10-29 07:29:06 +00:00
; ["/api" {:interceptors [::api ::db]}
; (["/get-user" {:get {:interceptors [get-user]}}]
; ["/add-user" {:post {:interceptors [add-user]}}]
2018-02-11 17:15:25 +00:00
; ["/add-order" {:post {:interceptors [add-order]}}])]
2017-10-29 07:29:06 +00:00
```