Lua Web快速開發(fā)指南(3) - 初識(shí)httpd庫路由

2019-06-18 22:53 更新

本章假設(shè)您已經(jīng)知道httpd server如何快速搭建, 并且知道cf的啟動(dòng)流程與運(yùn)行流程, 知曉httpd如何創(chuàng)建與啟動(dòng).

回顧上一章節(jié)

  -- 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內(nèi)置庫快速實(shí)現(xiàn)了一套httpd靜態(tài)文件server, 其中包括靜態(tài)文件目錄指定與端口設(shè)置. 并且在啟動(dòng)server后可以在看到測(cè)試頁面.

什么是"路由"與"路由表"?

Web路由用于描述資源到處理函數(shù)之間的一個(gè)映射關(guān)系.

Web路由表用于描述當(dāng)前作用域下所有路由的一個(gè)集合.

如下所示:

  /userlogin -> function userlogin(content) ... end


  /userinfo -> function userinfo(content) ... end

對(duì)于一個(gè)服務(wù)端開發(fā)者來說! 當(dāng)接受到客戶端的HTTP請(qǐng)求時(shí), 服務(wù)端會(huì)將請(qǐng)求URL中的PATH進(jìn)行分割, 然后開始尋找的PATH映射對(duì)應(yīng)的回調(diào)處理函數(shù).

當(dāng)URL映射的回調(diào)處理函數(shù)被找到時(shí), 將會(huì)為其注入整個(gè)http上下文并且根據(jù)處理函數(shù)的行為將返回值展現(xiàn)給資源訪問者.

這就是基本的路由雛形.

cf中的各種路由

cf的httpd庫利用這種機(jī)制, 為開發(fā)者提供了一整套完整的路由注冊(cè)方法, 其中包括: 靜態(tài)文件路由、API接口路由、USE頁面路由、WebSocket路由.

靜態(tài)文件路由我們?cè)谏弦徽鹿?jié)已經(jīng)看到過, 其本質(zhì)是根據(jù)需要讀取指定文件而存在的. 這種路由一般有庫編寫者或者框架編寫者實(shí)現(xiàn).

而API接口路由、USE頁面路由、Websocket路由則一般由開發(fā)自行指定, 這些路由一般都用來處理對(duì)應(yīng)的業(yè)務(wù)邏輯.

下面我們就開始學(xué)習(xí)如何在cf中注冊(cè)路由.

注冊(cè)API與USE路由

1. API路由

API接口路由用于快速構(gòu)建前、后端分離的web開發(fā)場(chǎng)景. 它提供了基于http協(xié)議提供了基礎(chǔ)的前、后端通訊的解決方案, 是目前位置Web領(lǐng)域最為常見的開發(fā)模式.

而作為前、后端數(shù)據(jù)溝通的橋梁自然需要指定指定數(shù)據(jù)交互類型. 目前為止, API路由的content-type為"application/json", 數(shù)據(jù)交互格式僅支持: json.

httpd庫為開發(fā)者提供了app:api方法用來注冊(cè)API路由, 第一個(gè)參數(shù)是一個(gè)字符串類型的資源路徑, 第二個(gè)參數(shù)則是回調(diào)處理方法;

現(xiàn)在讓我們?cè)?code>main.lua中, 添加我們剛剛學(xué)習(xí)到的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. 我們就可以看到我們輸出的接口數(shù)據(jù)了.

上面的代碼做了什么?

使用app:api定了一個(gè)查找路徑為/userinfo的API路由并定義了一個(gè)函數(shù)用于描述當(dāng)前資源被訪問時(shí)的行為. 路由函數(shù)會(huì)由httpd庫傳入了一個(gè)http context表, 它包含: method、path、body、file、args、headers等一系列屬性. 開發(fā)人員可以根據(jù)這些屬性用于執(zhí)行不同行為.

2. USE路由

USE路由與API路由類似. 不過USE路由的content-type類型為"text/html", 一般用作服務(wù)端渲染靜態(tài)頁面到瀏覽器.

現(xiàn)在讓我們編寫一段簡(jiǎn)單html代碼并注冊(cè)一個(gè)USE路由展示給用戶觀看:

  app:use('/index', function (content)
    return [[
    <html>
    <head>
      <title>簡(jiǎn)陋的頁面</title>
    </head>
    <body>
      <h1 align="center">簡(jiǎn)陋的首頁<h1>
    </body>
    </html>
    ]]
  end)

讓我們?cè)俅未蜷_瀏覽器, 輸入http://localhost:8080/index. 這樣就可以看到剛剛我們編寫的頁面了.

3. 靜態(tài)文件路由

app:static方法的第一個(gè)參數(shù)是一個(gè)文件夾字符串, 用于告訴httpd應(yīng)該如何確定文件查找路徑; 第二個(gè)參數(shù)是一個(gè)可選的整形數(shù)字, 用于告訴客戶端文件緩存周期.

我們?cè)谇懊娴拇a中已經(jīng)指定了app目錄下的static文件夾為靜態(tài)文件目錄. 這里就不再贅述. 直接打開瀏覽器輸入:http://localhost:8080/index.html再次查看效果.

4. websocket路由

app:ws方法為用戶提供將http協(xié)議升級(jí)為Websocket交互協(xié)議(http over Websocket), 使用ws方法注冊(cè)的路由稱為Websocket路由.

Websocket路由處理方法這里不做詳細(xì)贅述, 后面會(huì)有一個(gè)章節(jié)專門與大家討論Websocket路由的運(yùn)用.

完整代碼示例

  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>簡(jiǎn)陋的頁面</title>
    </head>
    <body>
      <h1 align="center">簡(jiǎn)陋的首頁<h1>
    </body>
    </html>
    ]]
  end)


  app:static("static", 30)


  app:listen("0.0.0.0", 8080)


  app:run()

繼續(xù)學(xué)習(xí)

下一章我們一起詳細(xì)學(xué)習(xí)httpd的庫

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)