Sinatra 路由 (route)
在 Sinatra 中,一个路由分为两部分:HTTP 方法 (GET, POST 等) 和 URL 匹配范式 (pattern)。每个路由都有一个要执行的代码块:
get '/' do
.. 显示内容 ..
end
post '/' do
.. 创建内容 ..
end
put '/' do
.. 更新内容 ..
end
delete '/' do
.. 删除内容 ..
end
options '/' do
.. 显示命令列表 ..
end
link '/' do
.. 建立某种联系 ..
end
unlink '/' do
.. 解除某种联系 ..
end
路由按照它们被定义的顺序进行匹配,这一点和 Rails 中的 routes 文件的定义类似。第一个与请求匹配的路由会被调用。
路由范式 (pattern) 可以包括具名参数,参数的值可通过params['name']
哈希表获得:
get '/hello/:name' do
# 匹配 "GET /hello/foo" 和 "GET /hello/bar"
# params[:name] 的值是 'foo' 或者 'bar'
"Hello #{params[:name]}!"
end
也可以通过代码块参数获得具名参数:
get '/hello/:name' do |n|
# 匹配"GET /hello/foo" 和 "GET /hello/bar"
# params[:name] 的值是 'foo' 或者 'bar'
# n 中存储了 params['name']
"Hello #{n}!"
end
路由范式 (pattern) 也可以包含通配符参数 (splat parameter),可以通过params[:splat]
数组获得。
get '/say/*/to/*' do
# 匹配 /say/hello/to/world
params[:splat] # => ["hello", "world"]
end
get '/download/*.*' do
# 匹配 /download/path/to/file.xml
params[:splat] # => ["path/to/file", "xml"]
end
通过正则表达式匹配的路由:
get %r{/hello/([\w]+)} do
"Hello, #{params[:captures].first}!"
end
%r{}
表示字符串是正则表达式,这里需要注意的就是,将正则表达式匹配的变量捕获到params['captures']
中了。
或者使用块参数:
get %r{/hello/([\w]+)} do |c|
"Hello, #{c}!"
end
路由范式也可包含可选的参数:
get '/posts.?:format?' do
# matches "GET /posts" and any extension "GET /posts.json", "GET /posts.xml" etc.
# 匹配 "GET /posts" 以及带任何扩展名的 "GET /posts.json" , "GET /posts.xml" 等
end
路由也可使用查询参数:
get '/posts' do
# matches "GET /posts?title=foo&author=bar"
# 匹配 "GET /posts?title=foo&author=bar"
title = params['title']
author = params['author']
# 使用title和 author 变量,对于 /posts 路由,查询参数是可选的
end
By the way, unless you disable the path traversal attack protection (see below), the request path might be modified before matching against your routes.
顺便说一下,除非想要禁用 路径遍历攻击保护 (path traversal attack protection) , 请求路径可在匹配路由之前修改。