Sinatra 路由 (route)

2023-12-19 15:32 更新

在 Sinatra 中,一個(gè)路由分為兩部分:HTTP 方法 (GET, POST 等) 和 URL 匹配范式 (pattern)。每個(gè)路由都有一個(gè)要執(zhí)行的代碼塊:

get '/' do
  .. 顯示內(nèi)容 ..
end

post '/' do
  .. 創(chuàng)建內(nèi)容 ..
end

put '/' do
  .. 更新內(nèi)容 ..
end

delete '/' do
  .. 刪除內(nèi)容 ..
end

options '/' do
  .. 顯示命令列表 ..
end

link '/' do
  .. 建立某種聯(lián)系 ..
end

unlink '/' do
  .. 解除某種聯(lián)系 ..
end

路由按照它們被定義的順序進(jìn)行匹配,這一點(diǎn)和 Rails 中的 routes 文件的定義類似。第一個(gè)與請(qǐng)求匹配的路由會(huì)被調(diào)用。

路由范式 (pattern) 可以包括具名參數(shù),參數(shù)的值可通過?params['name']?哈希表獲得:

get '/hello/:name' do
  # 匹配 "GET /hello/foo" 和 "GET /hello/bar"
  # params[:name] 的值是 'foo' 或者 'bar'
  "Hello #{params[:name]}!"
end

也可以通過代碼塊參數(shù)獲得具名參數(shù):

get '/hello/:name' do |n|
  # 匹配"GET /hello/foo" 和 "GET /hello/bar"
  # params[:name] 的值是 'foo' 或者 'bar'
  # n 中存儲(chǔ)了 params['name']
  "Hello #{n}!"
end

路由范式 (pattern) 也可以包含通配符參數(shù) (splat parameter),可以通過?params[:splat]?數(shù)組獲得。

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

通過正則表達(dá)式匹配的路由:

get %r{/hello/([\w]+)} do
  "Hello, #{params[:captures].first}!"
end

?%r{}?表示字符串是正則表達(dá)式,這里需要注意的就是,將正則表達(dá)式匹配的變量捕獲到?params['captures']?中了。

或者使用塊參數(shù):

get %r{/hello/([\w]+)} do |c|
  "Hello, #{c}!"
end

路由范式也可包含可選的參數(shù):

get '/posts.?:format?' do
  # matches "GET /posts" and any extension "GET /posts.json", "GET /posts.xml" etc.
  # 匹配 "GET /posts" 以及帶任何擴(kuò)展名的  "GET /posts.json" , "GET /posts.xml" 等
end

路由也可使用查詢參數(shù):

get '/posts' do
  # matches "GET /posts?title=foo&author=bar"
  # 匹配  "GET /posts?title=foo&author=bar"
  title = params['title']
  author = params['author']
  # 使用title和 author 變量,對(duì)于 /posts 路由,查詢參數(shù)是可選的
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.

順便說一下,除非想要禁用 路徑遍歷攻擊保護(hù) (path traversal attack protection) , 請(qǐng)求路徑可在匹配路由之前修改。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)