Mojolicious路由(一)

本篇起,我们开始讲述Mojolicious网站开发的重要功能之一——请求路由。每一个Mojolicious框架的开发者都需要明白请求路由怎么写。

一、分配器

每个web框架的基础都是一个小黑盒子,它将传入的请求与生成适当响应的代码连接起来。

GET /user/show/1 -> $c->render(text => 'Daniel');

这个黑盒通常被称为dispatcher——分配器。有许多实现使用不同的策略来建立这些连接,但几乎所有这些都是基于将请求URL的路径部分映射到某种响应生成器。

/user/show/2 -> $c->render(text => 'Isabell');
/user/show/3 -> $c->render(text => 'Sara');
/user/show/4 -> $c->render(text => 'Stefan');
/user/show/5 -> $c->render(text => 'Fynn');

上面这些例子,有规律的、静态的url,如此进行分配是十分低效的。因此,我们引入了正则表达式使调度过程更加动态。

qr!/user/show/(\d+)! -> $c->render(text => $users{$1});

现代分配器对于HTTP请求的解析不再仅仅局限于请求路径一项,它解析了更多的变量,例如请求方法、header请求头(HostUser-Agent, Accept):

GET /user/show/23 HTTP/1.1
Host: mojolicious.org
User-Agent: Mojolicious (Perl)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

二、路由

正则表达式虽然很强大,但是往往晦涩难懂。对于普通的静态路径来说用处不大:

qr!/user/show/(\d+)! -> $c->render(text => $users{$1});

因此,为了减少正则表达式的使用,很多框架采用了占位符在路径中代表特定的变量:

/user/show/:id -> $c->render(text => $users{$id});

与静态路径唯一的不同点是上例子中多了一个:id占位符。在同一个路径中,我们可以同时使用多个占位符:

/user/:action/:id

Mojolicious路由器的一个基本概念是将提取的占位符值转换为散列。

/user/show/23 -> /user/:action/:id -> {action => 'show', id => 23}

这个散列基本上是每个Mojolicious应用程序的中心,稍后我们将了解更多有关它的信息。在Mojolicious内部,路由被编译成正则表达式,因此只要有一点经验,我们就可以获得这两种方法的最佳效果。

/user/show/:id -> qr/(?-xism:^\/user\/show\/([^\/.]+))/

路径中的末尾斜杠始终是可选的。

/user/show/23/ -> /user/:action/:id -> {action => 'show', id => 23}

标签