<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                路由定義在一個單獨的?`routes`?文件中. 路由定義規則是: ~~~ (METHOD) (URL Pattern) (Controller.Action) ~~~ 下面演示路由的定義: ~~~ # conf/routes # 這個文件定義了應用程序的所有路由 (優先級按照先后順序) GET /login App.Login # 一個簡單的路由 GET /hotels/ Hotels.Index # 一個簡單的路由,帶不帶斜線后綴都一樣 GET /hotels/:id Hotels.Show # 綁定到一個URI參數id WS /hotels/:id/feed Hotels.Feed # WebSockets POST /hotels/:id/:action Hotels.:action # 自動匹配路由到一個控制器的多個方法 GET /public/*filepath Static.Serve("public") # 映射到 /public/下的靜態文件 ~~~ * /:controller/:action :controller.:action # 捕獲所有控制器方法; 自動生成 URL 接下來我們一個個看。最后在看看如何實現?**反轉路由**?– 生成URL調用一個特定的方法 ## 一個簡單的路由 ~~~ GET /login App.Login ~~~ 直接將一個URL精確匹配到一個控制器方法。 ## 斜線后綴 ~~~ GET /hotels/ Hotels.Index ~~~ `/hotels`?和?`/hotels/`?路由都會調用?`Hotels.Index`?方法。反轉?`Hotels.Index`產生的URL則會包含斜線后綴。 斜線后綴無法用于區分兩個同名路由,`/login`?和?`/login/`是一樣的 ## URL 參數 ~~~ GET /hotels/:id Hotels.Show ~~~ Revel可以從URL重提取參數并綁定到控制器方法。`:id`?變量會嘗試匹配除了斜線后綴外的任意值。舉個栗子,`/hotels/123`和?`/hotels/abc`?都與這個路由匹配。 提取的參數保存到?`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**標識符 相應的方法簽名如下: ~~~ func (c Hotels) Feed(ws *websocket.Conn, id int) revel.Result { ... } ~~~ ## 靜態文件服務 ~~~ GET /public/*filepath Static.Serve("public") GET /favicon.ico Static.Serve("public","img/favicon.png") ~~~ 對于使用2個參數的Static.Serve, 在?**”**?和?**,**?之間不允許有空格,due to how encoding/csv works. 對于靜態資源服務, Revel 有**static**?模塊支持, 包含一個單一的帶兩個參數的[靜態](http://godoc.org/github.com/revel/revel/modules/static/app/controllers)?控制器 * 前綴 (字符串) - 指定到靜態文件根目錄的相對或絕對路徑 * 文件路徑 (字符串) - 指定文件的相對路徑。 (可以參考?[代碼結構布局圖](http://gorevel.cn/docs/manual/organization.html)?了解更多信息) ## 固定參數 路由可以綁定一個或多個參數到控制器方法中,舉個栗子: ~~~ GET /products/:id ShowList("PRODUCT") GET /menus/:id ShowList("MENU") ~~~ 參數通過在路由中的位置綁定到參數名,這里,列表中的字符串將被綁定到方法的第一個參數中。 下面是幾種有用的情況: * 一組相似功能的方法 * 相同功能的方法,但工作在不同的模式 * 相同功能的方法,但操作不同的數據類型 ## 自動路由 ~~~ POST /hotels/:id/:action Hotels.:action ~~~ * /:controller/:action :controller.:action URL 的提取也可以用于確定調用哪個控制器方法。匹配規則不區分大小寫 第一個例子匹配下面的路由 ~~~ /hotels/1/show => Hotels.Show /hotels/2/details => Hotels.Details ~~~ 第二個例子匹配應用程序中的任意的方法 ~~~ /app/login => App.Login /users/list => Users.List ~~~ 由于匹配控制器和方法不區分大小寫,下面的路由也匹配 ~~~ /APP/LOGIN => App.Login /Users/List => Users.List ~~~ 使用自動路由作為一個捕獲所有的方法(例如文件中的最后一個路由),用于快速掛接方法,to non-vanity URLs,尤其是在與反向路由器一起使用是很有用的。 ## 反轉路由 對于以下幾種情況,使用反轉路由生成URLs是一個很好的方法, * 避免拼寫錯誤 * 編譯器確保反向路由有正確的數量和參數類型。 * 修改路由,僅需要在routes文件中修改一次 構建程序時,Revel自動生成一個路由包`app/routes`,一條語句就可以使用: ~~~ routes.Controller.Action(param1, param2) ~~~ 上面的語句使用Controller.Action和參數返回一個字符串類型的 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)) // <--- 反轉路由 } c.Flash.Success("Form processed!") return c.Redirect(routes.App.ViewConfirmation(username, input)) // <--- 反轉路由 } ~~~ **局限性:**?Only primitive parameters to a route are typed due to the possibility of circular imports. Non-primitive parameters are typed as interface{}.
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看