Mojolicious路由(十二)

一、WebSockets

通过Mojolicious::Routes::Route中的“websocket”方法,我们可以限制对websocket握手的访问,这是正常的GET请求和一些附加信息。

# /echo (WebSocket handshake)
$r->websocket('/echo')->to('foo#echo');

# Controller
package MyApp::Controller::Foo;
use Mojo::Base 'Mojolicious::Controller', -signatures;

# Action
sub echo ($self) {
  $self->on(message => sub ($self, $msg) {
    $self->send("echo: $msg");
  });
}

1;

当我们以101响应状态响应WebSocket握手请求时,连接就会建立,如果我们订阅了Mojolicious::Controller中带有“on”的事件,或者立即发送Mojolicious::Controller中带有“send”的消息,连接就会自动发生。

GET /echo HTTP/1.1
Host: mojolicious.org
User-Agent: Mojolicious (Perl)
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Key: IDM3ODE4NDk2MjA1OTcxOQ==
Sec-WebSocket-Version: 13

HTTP/1.1 101 Switching Protocols
Server: Mojolicious (Perl)
Date: Tue, 03 Feb 2015 17:08:24 GMT
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: SWsp5N2iNxPbHlcOTIw8ERvyVPY=

二、捕捉全部路由

由于路由是按照它们定义的顺序匹配的,所以我们可以使用一个可选的通配符占位符来捕获在最后一个路由中不匹配的所有请求。

# * /*
$r->any('/*whatever' => {whatever => ''} => sub ($c) {
  my $whatever = $c->param('whatever');
  $c->render(text => "/$whatever did not match.", status => 404);
});

标签