初识Web
一、路由与路由表
路由
是用于描述Web资源到处理函数之间的一个映射
.
路由表
是用于描述当前作用域下所有Web资源的路由集合
.
如下所示:
-- 用户登录路由到用户登录回调中的映射
/user/login -> function userlogin(content) ... end
-- 用户信息路由到用户信息回调中的映射
/user/info -> function userinfo(content) ... end
当接受到一个来自客户端发送的HTTP
请求时, 框架会根据URL
对前缀
与路径
进行分析并查找对应的回调函数
.
当URL
映射的回调函数
被找到时, 会将整个HTTP Context
注入到回调函数中. 其中包括请求方法、头部、参数、内容、来源等等.
用户可以通过这些信息对请求进行处理与分析后返回对应的结果! 这就是基于HTTP
的路由与服务处理的基本雏形.
二、路由的基本类型
httpd
库正是利用这种机制, 为开发者提供了一整套完整的路由注册方法! 其中基本的路由原型包括以下几种:
文件路由(
内置
);接口路由(
API路由
);页面路由(
USE路由
);WS路由(
Websocket
);
1. API路由
API路由用于快速构建前、后端分离的web开发场景. 它提供了基于http
协议前、后端通讯的解决方案.
作为前、后端数据沟通的桥梁, 自然需要指定指定数据交互类型. API路由的Content-Type
为application/json
.
httpd
库为开发者提供了app:api
方法用来注册API路由, 第一个参数是字符串类型的资源路径, 第二个参数则是回调处理方法.
现在, 让我们用一份示例代码
来揭示如何编写一个HTTP接口:
-- main.lua
local json = require "json"
app:api('/user/info', function(content)
return json.encode({ code = 200, user = { name = "CandyMi", age = 29, sex = "男" } })
end)
编写完之后启动cfadmin
, 在启动完成之后打开浏览器http://localhost:8080/user/info页面, 我们就可以看到我们输出的接口数据了.
有些同学可能要问: "上面的代码做了什么?"
首先我们导入了
json
库, 并且编写了一个"/user/info"
路径下的匿名函数
作为路由回调入口
;我们在函数体内返回一个
经过JSON编码的字符串
, 字符串的内容包含了一些需要返回给请求方的信息
;最后我们运行
cfadmin
成功后, 打开浏览器查看我们刚刚格式化输出到浏览器的内容;现在, 我们就完成了一个API路由定义.
2. USE路由
USE路由
与API路由
非常类似. 不过USE路由
的Content-Type
类型为"text/html", 一般用作服务端渲染静态页面到浏览器.
现在让我们注册一个USE路由, 并用它返回一段简单的HTML
给用户:
app:use('/index', function (content)
return [[
<html>
<head>
<title>简陋的页面</title>
</head>
<body>
<h1 align="center">简陋的首页<h1>
</body>
</html>
]]
end)
让我们重新运行cfadmin
后再次打开浏览器. 输入http://localhost:8080/index. 这样就可以看到刚刚我们编写的页面了.
从代码中我们可以看到! 同API路由
相比USE路由
注册的方式除了改为使用app:use
外几乎毫无差别.
3. 文件路由
需要用httpd
库为客户端提供静态文件访问
时就需要用到文件路由. 它是最直观的资源访问路由, 内置在框架内自行提供服务.
可以通过使用app:static
方法来开启文件路由功能: 第一个用来指定文件夹名, 第二个参数是TTL周期
(可选).
由于我们在前面的代码中已经指定了static
文件夹为静态文件目录. 有需要的同学可以自行进行相关测试, 这里就不再赘述.
我们现在打开浏览器, 在浏览器的地址栏输入:http://localhost:8080/index.html即可查看到效果.
4. websocket路由
使用app:ws
方法注册的路由称为WS路由
, 此方法为用户提供Websocket
交互协议(HTTP Over Websocket)实现.
由于篇幅问题, Websocket
路由这里不做详细讲解. 我们将会有一个章节专门与大家讨论Websocket
路由的使用与测试.
(完整代码示例)
local httpd = require "httpd"
local app = httpd:new("app")
local json = require "json"
app:api('/user/info', 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")
app:listen("0.0.0.0", 8080)
app:run()
三、继续学习
本章节我们与大家学会了基本的路由, 下一章节我们将一起详细了解如何使用httpd
库.