class Athena::Routing::RoutingHandler
inherits Reference
#
Provides basic routing functionality to an HTTP::Server.
This type works as both a HTTP::Handler and
an ART::RouteCollection
that accepts a block that will handle that particular route.
handler = ART::RoutingHandler.new
# The `methods` property can be used to limit the route to a particular HTTP method.
handler.add "new_article", ART::Route.new("/article", methods: "post") do |ctx|
pp ctx.request.body.try &.gets_to_end
end
# The match parameters from the route are passed to the callback as a `Hash(String, String?)`.
handler.add "article", ART::Route.new("/article/{id<\\d+>}", methods: "get") do |ctx, params|
pp params # => {"_route" => "article", "id" => "10"}
end
# Call the `#compile` method when providing the handler to the handler array.
server = HTTP::Server.new([
handler.compile,
])
address = server.bind_tcp 8080
puts "Listening on http://#{address}"
server.listen
Note
This handler should be the last one, as it is terminal.
Bubbling Exceptions#
By default, requests that result in an exception, either from Athena::Routing
or the callback block itself,
are gracefully handled by returning a proper error response to the client via HTTP::Server::Response#respond_with_status.
You can set bubble_exceptions: true
when instantiating the routing handler to have full control over the returned response.
This would allow you to define your own HTTP::Handler that can rescue the exceptions and apply your custom logic for how to handle the error.
class ErrorHandler
include HTTP::Handler
def call(context)
call_next context
rescue ex
# Do something based on the ex, such as rendering the appropriate template, etc.
end
end
handler = ART::RoutingHandler.new bubble_exceptions: true
# Add the routes...
# Have the `ErrorHandler` run _before_ the routing handler.
server = HTTP::Server.new([
ErrorHandler.new,
handler.compile,
])
address = server.bind_tcp 8080
puts "Listening on http://#{address}"
server.listen
Included modules
HTTP::Handler
Constructors#
.new(matcher : ART::Matcher::URLMatcherInterface | Nil = nil, collection : ART::RouteCollection = ART::RouteCollection.new, bubble_exceptions : Bool = false)
#
Methods#
#add(name : String, route : ART::Route, priority : Int32 = 0, &block : HTTP::Server::Context, Hash(String, String | Nil) -> Nil) : Nil
#
Adds the provided route with the provided name to this collection, optionally with the provided priority. The passed block will be called when a request matching this route is encountered.
#compile : self
#
Helper method that calls ART.compile
with the internal ART::RouteCollection
,
and returns self
to make setting up the routes easier.
handler = ART::RoutingHandler.new
# Register routes
server = HTTP::Server.new([
handler.compile,
])