Mojolicious初学(九)
一、Formats渲染格式
通常关于Formats格式,Mojolcious会通过template文件扩展名自动判定,例如.html。Mojolicious会自动的生成正确的模板,以及Content-Type的header值:
use Mojolicious::Lite -signatures;
# /detection 默认情况下,会返回html文件
# /detection.html 浏览器想要返回html文件
# /detection.txt 浏览器想要返回txt文件
get '/detection' => sub ($c) {
$c->render(template => 'detected');
};
app->start;
__DATA__
@@ detected.html.ep
<!DOCTYPE html>
<html>
<head><title>Detected</title></head>
<body>HTML was detected.</body>
</html>
@@ detected.txt.ep
TXT was detected.
同时,我们可以严格限制返回的格式:
use Mojolicious::Lite -signatures;
# /hello.json
# /hello.txt
get '/hello' => [format => ['json', 'txt']] => sub ($c) { #通过第一个=>后中括号增加一个键值对,限定只能返回json或txt格式
return $c->render(json => {hello => 'world'})
if $c->stash('format') eq 'json';
$c->render(text => 'hello world');
};
app->start;
我们也可以关闭格式检测:
use Mojolicious::Lite;
#通过format => 0将格式检测关闭,也可以叫做锁死——只允许返回一个格式:
# /hello
get '/hello' => [format => 0] => {text => 'No format detection.'};
# Disable detection and allow the following routes to re-enable it on demand
under [format => 0];
# /foo
get '/foo' => {text => 'No format detection again.'};
# 通过将format指定唯一个类型,也可以其他锁死类型的作用:
# /bar.txt
get '/bar' => [format => 'txt'] => {text => ' Just one format.'};
app->start;
二、内容协商Content negotiation
当我们的前端页面,例如jquery ajax函数要求服务器返回json、xml格式,可以通过respond_to方法:
use Mojolicious::Lite -signatures;
# /hello (Accept: application/json)
# /hello (Accept: application/xml)
# /hello.json
# /hello.xml
# /hello?format=json
# /hello?format=xml
get '/hello' => sub ($c) {
$c->respond_to( #此处调用respond_to,可以根据浏览器发送来的Content-Type: application/json或
#Content-Type: application/xml返回json或xml格式信息。
json => {json => {hello => 'world'}},
xml => {text => '<hello>world</hello>'},
any => {data => '', status => 204}
);
};
app->start;
我们还可以通过Mojolicious的types方法,轻松的修改MIME类型(http专用术语,自行百度):
app->types->type(rdf => 'application/rdf+xml');


