初识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-Typeapplication/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库.

Copyright © CandyMi 2019-2022 all right reserved,powered by Gitbook该文件修订时间: 2021-03-26 23:17:36

results matching ""

    No results matching ""