routes - niubods/playframework-notes GitHub Wiki

HTTP路由

路由是一个负责将HTTP请求转换成对动作(控制器的一个公共静态方法)调用的组件。

一个HTTP请求被MVC框架看做是一个事件。事件的信息包括两个不部分

  • 请求的路径,包括查询字符串。
  • HTTP方法(GET、POST、PUT、DELETE)

关于REST

REST(Representational state transfer)直译过来是“表现性状态传递”,字面意思看不出真实含义。

REST的几个关键设计原则:

  • 应用程序的功能划分为资源
  • 每一个资源由一个URI唯一指定
  • 所有资源在客户端和资源间转移状态的时候共享统一的接口。

路由文件语法

+ URI模式 + Java方法组成。可以使用#写注释

HTTP方法可以是:GET、 POST、 PUT、 DELETE、 HEAD。还支持WS表示WebSocket请求。如果使用*,表示匹HTTP请求的任意方法。

URI模式可以是静态字符串,也可以包含动态内容,动态内容部分要加花括号{...}

如:/clients/{id}

默认的动态内容匹配策略是匹配除了斜线/的任意字符,当然也可以自定义匹配策略可以用正则表达式来定义匹配策略,正则表达式要加尖括号<...>

如,只接受数字:/clients/{<[0-9]+>id}

注:动态部分都是有名字的,可以从控制器的params这个map对象中取出来。

路由定义中最后一项是java方法调用,使用java方法的全限定名称。action方法必须是public static void方法,控制器类必须定义在controllers包中而且必须是play.mvc.Controller的子类。

如果控制器类不是定义在controllers包中,需要在类名前加包名,否则就不需要,因为controller包是隐含的。

静态参数

可以使用指定的参数定义已有路由的别名,比如:

GET    /home              Application.page(id:'home')

就是用"home"做id,定义了下面这条路由的URL别名:

GET    /pages/{id}        Application.page

变量和脚本

routes文件中,可以用${...}引用变量,用%{...}定义脚本,例如:

%{ context = play.configuration.getProperty('context', '') }%
     
# Home page
GET    ${context}         Secure.login
GET    ${context}/        Secure.login

路由优先级

很多路由项可以匹配相同的URL请求,如果有冲突的话,将按照在route文件中声明的顺序,匹配最前面的路由项。

例如:

GET    /clients/all       Clients.listAll
GET    /clients/{id}      Clients.show

对于这样的定义,下面的URI请求:

/clients/all

将被第一个路由项拦截,并调用 Clients.listAll(尽管第二个路由项也匹配该请求)。

处理静态资源

使用 staticDir 作为特殊的action方法,可以将指定的文件目录公开为静态资源文件的容器。

例如:

GET    /public/           staticDir:public

当请求路径与 /public/* 匹配时,Play会从 /pubic 文件夹目录中取得静态资源文件。路由优先级也适用于这种静态资源的路由项。

⚠️ **GitHub.com Fallback** ⚠️