Revel 路由routes

2022-07-28 14:09 更新

路由定義在一個單獨的 routes 文件中.

路由定義規(guī)則是:

(METHOD) (URL Pattern) (Controller.Action)

下面演示路由的定義:

# conf/routes
# 這個文件定義了應(yīng)用程序的所有路由 (優(yōu)先級按照先后順序)
GET    /login                 App.Login              # 一個簡單的路由
GET    /hotels/               Hotels.Index           # 一個簡單的路由,帶不帶斜線后綴都一樣
GET    /hotels/:id            Hotels.Show            # 綁定到一個URI參數(shù)id
WS     /hotels/:id/feed       Hotels.Feed            # WebSockets
POST   /hotels/:id/:action    Hotels.:action         # 自動匹配路由到一個控制器的多個方法
GET    /public/*filepath      Static.Serve("public") # 映射到 /public/下的靜態(tài)文件
  • /:controller/:action :controller.:action # 捕獲所有控制器方法; 自動生成 URL

接下來我們一個個看。最后在看看如何實現(xiàn) 反轉(zhuǎn)路由 – 生成URL調(diào)用一個特定的方法

一個簡單的路由

GET    /login                 App.Login

直接將一個URL精確匹配到一個控制器方法。

斜線后綴

GET    /hotels/               Hotels.Index

/hotels 和 /hotels/ 路由都會調(diào)用 Hotels.Index 方法。反轉(zhuǎn) Hotels.Index產(chǎn)生的URL則會包含斜線后綴。

斜線后綴無法用于區(qū)分兩個同名路由,/login 和 /login/是一樣的

URL 參數(shù)

GET    /hotels/:id            Hotels.Show

Revel可以從URL重提取參數(shù)并綁定到控制器方法。:id 變量會嘗試匹配除了斜線后綴外的任意值。舉個栗子,/hotels/123和 /hotels/abc 都與這個路由匹配。

提取的參數(shù)保存到 Controller.Params map中, 綁定到控制器方法Show中. 舉個栗子:

func (c Hotels) Show(id int) revel.Result {
    ...
}

func (c Hotels) Show() revel.Result {
    var id string = c.Params.Get("id")
    ...
}

func (c Hotels) Show() revel.Result {
    var id int
    c.Params.Bind(&id, "id")
    ...
}

通配符

GET    /public/*filepath            Static.Serve("public")

路由器識別第二種通配符 。通配符必須放到路由的最后一個元素前, 匹配所有以*之前路徑開頭的URL

這里的路由將匹配 “/public/”和以他開頭的所有路徑

Websockets

WS     /hotels/:id/feed       Hotels.Feed

Websockets 以同樣的方式接受請求, 它使用 WS標識符

相應(yīng)的方法簽名如下:

func (c Hotels) Feed(ws *websocket.Conn, id int) revel.Result {
    ...
}

靜態(tài)文件服務(wù)

GET    /public/*filepath            Static.Serve("public")
GET    /favicon.ico                 Static.Serve("public","img/favicon.png")

對于使用2個參數(shù)的Static.Serve, 在  和 , 之間不允許有空格,due to how encoding/csv works.

對于靜態(tài)資源服務(wù), Revel 有static 模塊支持, 包含一個單一的帶兩個參數(shù)的靜態(tài) 控制器

  • 前綴 (字符串) - 指定到靜態(tài)文件根目錄的相對或絕對路徑
  • 文件路徑 (字符串) - 指定文件的相對路徑。

(可以參考 代碼結(jié)構(gòu)布局圖 了解更多信息)

固定參數(shù)

路由可以綁定一個或多個參數(shù)到控制器方法中,舉個栗子:

GET    /products/:id     ShowList("PRODUCT")
GET    /menus/:id        ShowList("MENU")

參數(shù)通過在路由中的位置綁定到參數(shù)名,這里,列表中的字符串將被綁定到方法的第一個參數(shù)中。

下面是幾種有用的情況:

  • 一組相似功能的方法
  • 相同功能的方法,但工作在不同的模式
  • 相同功能的方法,但操作不同的數(shù)據(jù)類型

自動路由

POST   /hotels/:id/:action    Hotels.:action
  • /:controller/:action :controller.:action

URL 的提取也可以用于確定調(diào)用哪個控制器方法。匹配規(guī)則不區(qū)分大小寫

第一個例子匹配下面的路由

/hotels/1/show    => Hotels.Show
/hotels/2/details => Hotels.Details

第二個例子匹配應(yīng)用程序中的任意的方法

/app/login         => App.Login
/users/list        => Users.List

由于匹配控制器和方法不區(qū)分大小寫,下面的路由也匹配

/APP/LOGIN         => App.Login
/Users/List        => Users.List

使用自動路由作為一個捕獲所有的方法(例如文件中的最后一個路由),用于快速掛接方法,to non-vanity URLs,尤其是在與反向路由器一起使用是很有用的。

反轉(zhuǎn)路由

對于以下幾種情況,使用反轉(zhuǎn)路由生成URLs是一個很好的方法,

  • 避免拼寫錯誤
  • 編譯器確保反向路由有正確的數(shù)量和參數(shù)類型。
  • 修改路由,僅需要在routes文件中修改一次

構(gòu)建程序時,Revel自動生成一個路由包app/routes,一條語句就可以使用:

routes.Controller.Action(param1, param2)

上面的語句使用Controller.Action和參數(shù)返回一個字符串類型的 URL,下面給出一個完整的例子:

import (
    "github.com/revel/revel"
    "project/app/routes"
)

type App struct { *revel.Controller }

// 生成一個表單頁面
func (c App) ViewForm(username string) revel.Result {
    return c.Render(username)
}

// 處理提交的表單
func (c App) ProcessForm(username, input string) revel.Result {
    ...
    if c.Validation.HasErrors() {
        c.Validation.Keep()
        c.Flash.Error("Form invalid. Try again.")
        return c.Redirect(routes.App.ViewForm(username))  // <--- 反轉(zhuǎn)路由
    }
    c.Flash.Success("Form processed!")
    return c.Redirect(routes.App.ViewConfirmation(username, input))  // <--- 反轉(zhuǎn)路由
}

局限性: Only primitive parameters to a route are typed due to the possibility of circular imports. Non-primitive parameters are typed as interface{}.

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號