lua web快速開發指南(3)
本章假設您已經知道httpd server如何快速搭建, 並且知道cf的啟動流程與執行流程, 知曉httpd如何建立與啟動.
回顧上一章節
-- script/main.lua
local httpd = require "httpd"
local app = httpd:new("app")
app:static("static", 30)
app:listen("0.0.0.0", 8080)
app:run()
我們利用httpd內建庫快速實現了一套httpd靜態檔案server, 其中包括靜態檔案目錄指定與埠設定. 並且在啟動server後可以在看到測試頁面.
什麼是"路由"與"路由表"?
Web路由用於描述資源到處理函式之間的一個對映關係.
Web路由表用於描述當前作用域下所有路由的一個集合.
如下所示:
/userlogin -> function userlogin(content) ... end
/userinfo -> function userinfo(content) ... end
對於一個服務端開發者來說! 當接受到客戶端的HTTP請求時, 服務端會將請求URL中的PATH進行分割, 然後開始尋找的PATH對映對應的回撥處理函式.
當URL對映的回撥處理函式被找到時, 將會為其注入整個http上下文並且根據處理函式的行為將返回值展現給資源訪問者.
這就是基本的路由雛形.
cf中的各種路由
cf的httpd庫利用這種機制, 為開發者提供了一整套完整的路由註冊方法, 其中包括: 靜態檔案路由、API介面路由、USE頁面路由、WebSocket路由.
靜態檔案路由我們在上一章節已經看到過, 其本質是根據需要讀取指定檔案而存在的. 這種路由一般有庫編寫者或者框架編寫者實現.
而API介面路由、USE頁面路由、Websocket路由則一般由開發自行指定, 這些路由一般都用來處理對應的業務邏輯.
下面我們就開始學習如何在cf中註冊路由.
註冊API與USE路由
1. API路由
API介面路由用於快速構建前、後端分離的web開發場景. 它提供了基於http協議提供了基礎的前、後端通訊的解決方案, 是目前位置Web領域最為常見的開發模式.
而作為前、後端資料溝通的橋樑自然需要指定指定資料互動型別. 目前為止, API路由的content-type為"application/json", 資料互動格式僅支援: json.
httpd庫為開發者提供了app:api
方法用來註冊API路由, 第一個引數是一個字串型別的資源路徑, 第二個引數則是回撥處理方法;
現在讓我們在main.lua
中, 新增我們剛剛學習到的api路由:
-- main.lua
local json = require "json"
app:api('/userinfo', function(content)
return json.encode({
code = 200,
user = {
name = "CandyMi",
age = 29,
sex = "男",
}
})
end)
然後開啟瀏覽器, 輸入http://localhost:8080/userinfo
. 我們就可以看到我們輸出的介面資料了.
上面的程式碼做了什麼?
使用app:api
定了一個查詢路徑為/userinfo
的API路由並定義了一個函式用於描述當前資源被訪問時的行為. 路由函式會由httpd庫傳入了一個http context表, 它包含: method、path、body、file、args、headers等一系列屬性. 開發人員可以根據這些屬性用於執行不同行為.
2. USE路由
USE路由與API路由類似. 不過USE路由的content-type型別為"text/html", 一般用作服務端渲染靜態頁面到瀏覽器.
現在讓我們編寫一段簡單html程式碼並註冊一個USE路由展示給使用者觀看:
app:use('/index', function (content)
return [[
<html>
<head>
<title>簡陋的頁面</title>
</head>
<body>
<h1 align="center">簡陋的首頁<h1>
</body>
</html>
]]
end)
讓我們再次開啟瀏覽器, 輸入http://localhost:8080/index
. 這樣就可以看到剛剛我們編寫的頁面了.
3. 靜態檔案路由
app:static
方法的第一個引數是一個資料夾字串, 用於告訴httpd應該如何確定檔案查詢路徑; 第二個引數是一個可選的整形數字, 用於告訴客戶端檔案快取週期.
我們在前面的程式碼中已經指定了app
目錄下的static
資料夾為靜態檔案目錄. 這裡就不再贅述. 直接開啟瀏覽器輸入:http://localhost:8080/index.html
再次檢視效果.
4. websocket路由
app:ws
方法為使用者提供將http協議升級為Websocket互動協議(http over Websocket), 使用ws方法註冊的路由稱為Websocket路由.
Websocket路由處理方法這裡不做詳細贅述, 後面會有一個章節專門與大家討論Websocket路由的運用.
完整程式碼示例
local httpd = require "httpd"
local app = httpd:new("app")
local json = require "json"
app:api('/userinfo', function(content)
return json.encode({
code = 200,
user = {
name = "CandyMi",
age = 29,
sex = "男"
}})
end)
app:use('/index', function (content)
return [[
<html>
<head>
<title>簡陋的頁面</title>
</head>
<body>
<h1 align="center">簡陋的首頁<h1>
</body>
</html>
]]
end)
app:static("static", 30)
app:listen("0.0.0.0", 8080)
app:run()
繼續學習
下一章我們一起