美文网首页Lua Web开发
Lua Web快速开发指南(3) - 初识httpd库路由

Lua Web快速开发指南(3) - 初识httpd库路由

作者: 水果糖的小铺子 | 来源:发表于2019-06-14 04:10 被阅读0次

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

    相关文章

      网友评论

        本文标题:Lua Web快速开发指南(3) - 初识httpd库路由

        本文链接:https://www.haomeiwen.com/subject/vluyfctx.html