webserver的router基本都是差不多的
Spark的router是通过三个简单的部分组成的
- A verb (get, post, put, delete, head, trace, connect, options)
- A path (/hello, /users/:name)
- A callback (request, response) -> { }
目录
1. 基础函数
基本的函数如下
get("/", (request, response) -> {
// Show something
});
post("/", (request, response) -> {
// Create something
});
put("/", (request, response) -> {
// Update something
});
delete("/", (request, response) -> {
// Annihilate something
});
options("/", (request, response) -> {
// Appease something
});
2. params()函数
与此同时,Route模式也是可以携带参数的,通过使用 params() 函数获取 URL 中的参数
// matches "GET /hello/foo" and "GET /hello/bar"
// request.params(":name") is 'foo' or 'bar'
get("/hello/:name", (request, response) -> {
return "Hello: " + request.params(":name");
});
3. splat() 函数
Route 模式也支持从request的url中获取相应的值,就是直接获取url对应的参数,而参数是通过使用 splat() 函数实现的
// matches "GET /say/hello/to/world"
// request.splat()[0] is 'hello' and request.splat()[1] 'world'
get("/say/*/to/*", (request, response) -> {
return "Number of splat parameters: " + request.splat().length;
});
4. unmap()模式
通过使用unmap模式,可以自动不匹配出现的url
unmap("/hello"); // unmaps all routes with path 'hello'
unmap("/hello", "get"); // unmaps all 'GET' routes with path 'hello'
5. path()函数
当我们在同一个前缀下下有多个分支时,可以采用这个path函数,从而使得整个函数更加精简
path("/api", () -> {
before("/*", (q, a) -> log.info("Received api call"));
path("/email", () -> {
post("/add", EmailApi.addEmail);
put("/change", EmailApi.changeEmail);
delete("/remove", EmailApi.deleteEmail);
});
path("/username", () -> {
post("/add", UserApi.addUsername);
put("/change", UserApi.changeUsername);
delete("/remove", UserApi.deleteUsername);
});
});
6. Filters
个人感觉spark的filter方法写起来是真的十分简便,最主要通过 before 或者 after实现,在可阅读性方面十分之强
(1)Before : 在对应的url访问之前需要做的操作。
before((request, response) -> {});
(2)After: 在对应url 的request被处理完以后,可以通过这个url去读取对应的 response的值
after((request, response) -> {});
(3)afterAfter: 就是在After以后在监听一次,可以看看经过After处理之后的response的值
afterAfter((request, response) -> {
response.header("foo", "set by afterAfter filter");
});
上面的三种模式可以看出,在spark中支持在请求前的处理,同时也可以去监听请求后的response的处理,可以达到一种闭环操作。
于此同时,还支持选择一种模式,使得只有当请求的路径匹配到该模式时,才会被处理
before("/protected/*", (request, response) -> {
// ... check if authenticated
halt(401, "Go Away!");
});