play框架(scala版,系列10——路由三要素)

編程語言 Scala Links 技術 用心玩技術 用心玩技術 2017-08-28

play框架中,路由三要素分別是:http方法,URI樣式,Action生成器方法調用。以下分別說明。

1. HTTP方法

HTTP方法可以是所有合法的HTTP協議方法(GET, PATCH, POST, PUT, DELETE, HEAD)。

2. URI樣式

URI樣式定義了路由的請求路徑。部分請求路徑可以是動態的。

2.1 靜態路徑

比如我們需要精確匹配請求: GET /clients/all ,我們可以定義這樣的路由:

GET /clients/all controllers.Clients.list()

2.2 動態部分

如果我們需要定義的路由,是關於類似於通過id獲取客戶端信息的,我們需要添加一個動態部分:

GET /clients/:id controllers.Clients.show(id: Long)

注意:uri樣式可以有多個動態部分。

動態部分默認的匹配策略就是正則表達式,這意味著任意動態部分被定義成諸如 :id 的樣式將會被嚴格匹配到一個uri路徑片段。不像其他樣式類型,在傳入控制器之前,路徑片段在路由中將被自動編碼,並以反路由的形式被編碼。

2.3 多個反斜槓隔開的動態部分

如果我們希望動態部分能捕獲多個uri路徑片段,以正斜槓分開,我們可以用 *id 語法定義動態部分,也通常被稱為通配符,因為它使用了 .* 正則表達式:

GET /files/*name controllers.Application.download(name)

我們這裡,像類似於GET /files/images/logo.png 請求,name動態部分將捕獲 images/logo.png。

要注意由正斜槓分開的動態部分不能被路由解碼也不能被反路由編碼。

我們需要自己驗證原uri片段以應對用戶輸入。反路由簡單做了字符串連接,因此我們需要確保結果路徑是有效的,無效路徑諸如:包含多個斜槓或者非ASCII字符。

2.4 自定義正則表達式的動態部分

我們也可以為動態部分自定義正則表達式。使用$id<regex> 語法:

GET /items/$id<[0-9]+> controllers.Items.show(id: Long)

就像通配路由,參數沒有被路由解碼也沒有被反路由編碼。我們需要自己負責輸入的驗證,以確保上下文有效。

開發者也可以在路由定義行前置一個 + 號以定義修改器,這個定義可以改變某些play組件的行為,其中一個修改器名為"nocsrf"修改器,主要用於添加CSRF過濾器。

+ nocsrf

3.Action生成器方法調用

路由定義的最後部分就是調用。這個部分必須定義一個針對action方法的合法調用。

如果方法沒有定義任何參數,那麼直接給全限定方法名即可:

GET / controllers.Application.homePage()

如果action方法定義了參數,那麼正確的參數值應該能正常獲取,獲取方式有可能是從uri路徑上直接讀取,也可能是從參數解析讀取。

# Extract the page parameter from the path.# i.e. http://myserver.com/indexGET /:page controllers.Application.show(page)

或者:

# Extract the page parameter from the query string.# i.e. http://myserver.com/?page=indexGET / controllers.Application.show(page)

下面是正確的show方法定義,它位於controllers.Application控制器:

public Result show(String page) {

3.1 參數類型

參數類型是可選的。只有在我們需要將傳入參數轉換為特定的scala類型的時候,我們可以添加顯式的類型:

GET /clients/:id controllers.Clients.show(id: Long)

然後使用同樣的類型作為action方法參數的正確類型:

public Result show(Long id) {

3.2 固定值參數

有時候我們需要固定值的參數:

# Extract the page parameter from the path, or fix the value for /GET / controllers.Application.show(page = "home")GET /:page controllers.Application.show(page)

3.3 默認值參數

默認值參數的情況如下:

# Pagination links, like /clients?page=3GET /clients controllers.Clients.list(page: Int ?= 1)

3.4 可選參數

可選參數的情形如下:

# The version parameter is optional. E.g. /api/list-all?version=3.0GET /api/list-all controllers.Api.list(version ?= null)

play框架(scala版,系列10——路由三要素)

相關推薦

推薦中...