lua-web快速开发指南3-初识httpd库路由

54次阅读

共计 2460 个字符,预计需要花费 7 分钟才能阅读完成。

本章假设您已经知道 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()

继续学习

下一章我们一起详细学习 httpd 的库

正文完
 0