
The default web server of the Crystal is quite good :smile: but it weak at routing :cry:. Kemal is an awesome defacto standard web framework for Crystal :smile:, but it's too fat for some purpose :cry:.
route.cr is a minimum but High Performance middleware for Crystal web server. See the amazing performance of route.cr here.:rocket:
route.cr also contains
- Convenient rendering tool
- Access profiler
Installation
Add this to your application's shard.yml
:
dependencies:
route:
github: tbrand/route.cr
Usage
Basic usage
require "route"
Include Route
to utilize route.cr.
class WebServer
include Route
end
In the following sample codes, class WebServer ... end
will be omitted.
To initialize RouteHandler
@route_handler = RouteHandler.new
To define API, call API.new with context
and params
(optional) where context is HTTP::Server::Context and params is Hash(String, String). All APIs have to return the context. In this example, params is omitted. (The usage of params is later)
@index = API.new do |context|
context.response.print "Hello route.cr"
context # returning context
end
Define your routes in a draw
block.
draw(@route_handler) do # Draw routes
get "/", @index
end
To activate the routes
def run
server = HTTP::Server.new(3000, @route_handler) # Set RouteHandler to your server
server.listen
end
Finally, run your server.
web_server = WebServer.new
web_server.run
See sample for details.
Path parameters
params
is a Hash(String, String) that is used when you define a path parameters such as /user/:id
(:id
is a parameters). Here is an example.
class WebServer
@route_handler = RouteHandler.new
@user = API.new do |context, params|
context.response.print params["id"] # get :id in url from params
context
end
def initialize
draw(@route_handler) do
get "/user/:id", @user
end
end
end
params
also includes query params such as /user?id=3
. Here is an example.
class WebServer
@route_handler = RouteHandler.new
@user = API.new do |context, params|
response_body = "user: "
# Get a query param like /user?id=3
response_body += params["id"] if params.has_key?("id")
context.response.print response_body
context
end
def initialize
draw(@route_handler) do
get "/user", @user
end
end
end
See sample for details.
Rendering views(.ecr)
route.cr also support simple rendering function to render .ecr
file with parameters.
First, define your view like
def_view :view_sample, "sample/public/hello.ecr", name: String, num: Int32
where "sample/public/hello.ecr" is
My name is <%= @name %>. The number is <%= @num %>.
:view_sample
is an identifier of the view. "sample/public/hello.ecr" is a relative path to the file. name
and num
are parameters used in "sample/public/hello.ecr". Note that these parameters have to be class variables in the file. See here. When you render them, just call render_view
like
context.response.print render_view(:view_sample, "tbrand", 10)
See sample for details.
Get profiles
route.cr also serves ProfileHandler. By using this, you can easily get the access data like
[ GET /one ] Access: 10 Total: 704.0µs Ave: 70.4µs
[ GET /two ] Access: 9 Total: 309.0µs Ave: 34.3µs
[ GET /three ] Access: 9 Total: 262.0µs Ave: 29.1µs
For this, just set ProfileHandler
to your server like
server = HTTP::Server.new(3000, [ProfileHandler.new, @route_handler])
After running your server, try accessing "/profile".
See sample for details.
Contributing
- Fork it ( https://github.com/tbrand/route.cr/fork )
- Create your feature branch (git checkout -b my-new-feature)
- Commit your changes (git commit -am 'Add some feature')
- Push to the branch (git push origin my-new-feature)
- Create a new Pull Request
Contributors
- tbrand Taichiro Suzuki - creator, maintainer