Bailador 是對 Perl Dancer Web 開發框架的模仿。安裝方法:
panda install Bailador# orzef install Bailador
我們來創建一個腳本 first.pl,打印 "hello world":
use v6;use Bailador;get '/' => sub { "hello world"}baile;
運行:perl6 first.pl 它會啟動一個小型的 Web 服務器,你可以在3000端口上訪問它:
$ perl6 first.plEntering the development dance floor: http://0.0.0.0:3000[2016-05-05T12:57:31Z] Started HTTP server.
在 Bailador 中,我們需要把 HTTP 請求方法和服務器上的路徑映射給一個匿名子例程, 這個子例程會返回它里面的內容。在這個例子中,我們把我們告訴它的網站根路徑的 get HTTP 請求映射為返回字符串 hello world。如果你啟動這個程序并用瀏覽器打開 http://0.0.0.0:3000/ 你就會看到這個文本。
我們還可以映射其它路徑(path-es):
get '/about' => sub { "關于我"}
這會把 http://0.0.0.0:3000/about url 映射為返回 「關于我」。
路徑中的一部分可以是以冒號開頭的占位符:
get '/hello/:name' => sub ($name) { "Hello $name!"};
:name 部分能匹配除了斜線 / 之外的任何字符串,并且它所匹配到的值會被賦值給匿名子例程中的 $name 變量。
這樣的占位符你可以擁有多個,并且占位符的實際名字是什么無關緊要。占位符所捕獲到的值會按照它們出現在 url 中的順序賦值給函數的參數。
get '/hello/:first/:family' => sub ($fname, $lname) { "Hello $fname! And hi $lname"};
在這個例子中,無論 :first 占位符捕獲到的是什么,它都會被賦值給 $fname 參數,無論 :family 捕獲到的是什么,它都會被賦值給 :$lname。例如 url http://0.0.0.0:3000/hello/Foo/Bar 會生成如下響應:
Hello Foo! And hi Bar!
當然,讓占位符的名字和參數的名字相同可能會讓代碼更易讀。這是第二個腳本的完整版本:
use v6;use Bailador;get '/' => sub { "hello world"}get '/hello/:first/:family' => sub ($fname, $lname) { "Hello $fname! And hi $lname"};baile;
我們來看看怎么從用戶那兒接收輸入并把輸入回顯給用戶。
對于這,我們必須創建兩個路由(routes)因為現在 Bailador 還不能處理 GET 參數。
# echo_post.p6use v6;use Bailador;get '/' => sub { '';}post '/echo' => sub { my $text = request.params// ''; my $html = 'You said (in a POST request) '; $html ~= $text; return $html;}baile;
img
我們能看到怎么創建一個路由來處理 POST 請求。
第一個路由 get '/' => { 會發送一個 GET 請求并且它會返回一個包含在這個腳本中的 HTML 片段。(我知道,我們很快就會使用模板了) 那個 HTML 片段包含了一個帶有單個文本框的表單和一個提交按鈕。這個表單有一個通向 /echo URL 的 action,并且表單擁有 method="POST"。這意味著,當用戶點擊提交按鈕時,瀏覽器會發送回 POST 請求。
第二個路由 post '/echo' => sub { 會處理 /echo 路徑的 POST 請求。
Bailador 提供的 request 函數以 Bailador::Request的形式返回代表當前請求的對象。
request 函數有幾個方法,其中一個是 params 方法,它返回一個散列,其中散列的鍵是參數的名字(在我們這個例子中是 text),值是提交的值。
我們把那個值保存在 $text 變量中,并且我們使用 '//' defined-or 操作符來設置變量的值為空,在用戶沒有提供任何值的情況下。然后我們連接用戶提供的值組成 "html" 字符串。最后發送回那個字符串,我們這個小小的回顯服務器就能工作啦。
img
use v6;use Bailador;get '/' => sub { '';}get '/echo' => sub { return 'You said (in a GET request) ' ~ (request.params// '');}baile;
img
在這個例子中,我省略了臨時變量 $text 和 $html,在之前的例子中它們也不是必要的。當我們使用 GET 方法請求后,提交后回在瀏覽器的 URL 地址欄中拼接上我們的 text 字段和字段的值。
在下面這個模板中,它把數據接收到變量 $h 中,之后使用這個變量來展示版本號和當前時間 - 從紀元開始的秒數。bailador/code_in_module/views/index.tt
% my ($h) = @_;Bailador App Bailador App
Version <%= $h%> Current time: <%= $h %>
這個文件把所有代碼包含在類中:
unit class Demo;
為了擁有特定領域語言(DSL),它加載了 Bailador 以讓我們定義路由更容易。
use Bailador;
最重要的是它包含了路由。
unit class Demo;use Bailador;my $version = '0.01';get '/' => sub { template 'index.tt', { version => $version, date => time }}
use Bailador;Bailador::import();use lib callframe(0).file.IO.dirname ~ '/lib';use Demo;baile;
最有意思的應該是這段代碼:
use lib callframe(0).file.IO.dirname ~ '/lib';
它計算這個工程的根目錄 - 假設 app.pl 文件在根目錄中 - 然后把 /lib 子目錄添加到 perl 將要查找額外模塊的地方。這會在 lib 子目錄下加載 Demo.pm 文件。
img
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com