lucky_router
route.cr
The default web server of the Crystal is quite good but it weak at routing. Kemal is an awesome defacto standard web framework for Crystal, but it's too fat for some purpose.
route.cr is a minimum but powerful High Performance middleware for Crystal web server. See the amazing performance of route.cr here
Installation
Add this to your application's shard.yml
:
dependencies:
route:
github: tbrand/route.cr
Usage
Basic usage
require "route"
Include Route
to utilize this.
class WebServer
include Route
end
In the following example codes, class WebServer ... end
will be omitted.
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
end
Define your routes in a draw
block.
draw(@route_handler) do
get "/", @index
end
To activate the routes
def run
server = HTTP::Server.new(3000, @route_handler)
server.listen
end
Finally, run your server.
web_server = WebServer.new
web_server.run
Path parameters
params
is a Hash(String, String) that is used when you define a path including 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
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
: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.
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