您的位置:首页 > 理论基础 > 计算机网络

Play framework路由(Http route)

2017-07-16 14:38 274 查看
路由是将每一个http请求转换为一个action调用的组件(在控制器中的一个静态的公用方法)

每个request请求都被MVC框架看做是一个事件,这个事件包含两个主要信息:1.请求路径。2.请求方法

路由是被定义在conf/routes文件之中的,路由文件是被编译过的,所以如果路由对应的action不存在或者有问题都会直接报错,你可以在浏览器中直接看到路由报错信息。

conf/routes是被用作路由的配置文件,这个配置文件列出了应用程序所需的所有的配置文件,每个路由由一个http方法和一个URI模式及action调用组成。

看如下路由定义:

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

注意:在action调用中,参数类型定义在参数之后,中间使用:隔开,参数提取自URI.

HTTP方法:GET POST PUT DELETE HEAD

URI模式:URI模式定义路由的请求路径,请求路径的一部分可以是动态的。

静态路由:精确的匹配路由 GET clients/all路由可以定义为:

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


动态路由:如果你想定义一个路由通过id动态的检索,路由可以定义为:

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

注意:一个路由可以有多个部分是动态的,动态部分的默认匹配规则是由正则表达式定义的,这意味着任何定义为id的动态部分将完全匹配一个URI路径段。

多个动态的URI路段

如果你想捕获多个动态URI路段,用正斜杠分割,你可以定义一个动态的路段使用*id语法,也就是使用.*正则表达式。

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


这样的请求例如:
GET /files/images/logo.png,name对应的动态部分就是
images/logo.png




自定义正则表达式

你也可以自定义正则表达式对应到动态部分,使用
$id<regex>
语法:

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


参数类型

对于String类型的参数,参数类型是可选的,如果你想让play接收到的参数转换成对应的类型,你需要添加指定的类型。

public static Result show(Long id) {
Client client = Client.findById(id);
return ok(views.html.Client.show(client));
}


固定值参数

有时你可能需要对一个参数使用固定值

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


默认参数值

在接到的请求中如果没有发现参数值你可以提供一个默认值

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


可选参数

还可以指定不需要在所有请求中出现的可选参数:

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


路由优先级

许多路由可以匹配相同的请求,如果发生冲突,在前面的路由将被使用(按照声明的顺序)

颠倒路由

路由器可以用来从一个java调用生成URL这使集中在一个配置文件中的所有URI模式成为可能,因此,在重构应用程序时,您可以更加自信。

对于路由文件中使用的每个控制器,路由将会自动生成一个颠倒的路由,有相同的actiion方法,使用相同的签名,但是返回的是一个play.mvc.Call 而不是
play.mvc.Result


这个
play.mvc.Call
提供一个HTTP调用,即提供HTTP方法也提供URI,例如你创建了如下的控制器:

package controllers;

<
c9a7
/span>import play.*;
import play.mvc.*;

public class Application extends Controller {

public static Result hello(String name) {
return ok("Hello " + name + "!");
}

}

如果你在路由文件中映射:

# Hello action
GET   /hello/:name          controllers.Application.hello(name)


你可以颠倒action方法的URL,通过
controllers.routes.Application
颠倒控制器,

// Redirect to /hello/Bob
public static Result index() {
return redirect(controllers.routes.Application.hello("Bob"));
}


这里的控制器包都有一个控制器子包,因此
controllers.admin.Application.hello
可以颠倒成
controllers.admin.routes.Application.hello
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: