data Router
Routes by method and path pattern. Patterns are /-separated segments: a literal, :name (one segment, decoded into
req.param("name")) or *rest (the rest of the path, last segment only). A trailing / is ignored. The first matching route
wins; a path that matches with another method gives 405 with Allow; OPTIONS on a known path answers 204 with Allow;
HEAD uses the GET route.
Example:
use std.http { Server, ServerConfig, ServerHandle, Router, Request, Reply, Client, Header, HttpConfig, Response, Middleware, Next, withMiddleware, requireHeader, logRequests, timing, WebSocket, WsConfig, SseWriter, BodyWriter, chunks }
fn body(req: Request) -> str {
match req.text() {
str t => t
DecodeError _ => ""
}
}
fn run() -> () | NetError | DecodeError | Panicked net, io, time {
let srv = Server.bind(ServerConfig{ port: 0, followNode: false })?
defer srv.close()
let stop = srv.handle()
let base = "http://127.0.0.1:{srv.port()}"
let router = Router.new()
.get("/users/:id", (req: Request) => Reply.text("user {req.param("id") ?? "?"}"))
.get("/files/*rest", (req: Request) => Reply.text("file {req.param("rest") ?? "?"}"))
scope {
spawn stop.serve(router)
print((Client.get("{base}/users/42")?).text()?)
print((Client.get("{base}/files/a/b.txt")?).text()?)
print((Client.delete("{base}/users/42")?).status)
stop.shutdown()
()
}?
}
fn main() io, net, time {
match run() {
NetError _ => print("net error")
DecodeError _ => print("decode error")
Panicked _ => print("panicked")
_ => {}
}
}Вывод
user 42 file a/b.txt 405
pub(api) data RouterПотокобезопасность. build it before serving; `handle` only reads it, so one router can serve many requests at once.
С версии. 1.0.0-beta
Методы
new | () -> RouterAn empty router (every request is a 404 until routes are added). |
route | (method: str, pattern: str, handler: Handler) -> RouterAdds a route for any method name. |
get | (pattern: str, handler: Handler) -> RouterAdds a GET route (HEAD requests use it too). |
post | (pattern: str, handler: Handler) -> RouterAdds a POST route. |
put | (pattern: str, handler: Handler) -> RouterAdds a PUT route. |
patch | (pattern: str, handler: Handler) -> RouterAdds a PATCH route. |
delete | (pattern: str, handler: Handler) -> RouterAdds a DELETE route. |
fallback | (handler: Handler) -> RouterThe handler for requests that match no route (default |
layer | (mw: Middleware) -> RouterAdds a middleware around everything the router does. |
handle | (req: Request) -> Reply net, io, timeAnswers a request |
dispatch | (req: Request) -> Reply net, io, timeRoute lookup and call, without the middleware. |
Определено в: std/http/http.oxl:3012