轻语言网站:服务端脚本程序API接口

文档概述

本章讲解如何在轻语言网页程序中编写后端脚本文件(.sph),轻语言网站程序中的后端脚本文件采用轻语言语法编写,编译时输出为标准 PHP 文件,可在该文件中操作数据库增删改查、读写服务器中的文件。

学习目标

阅读本文档后,你应当能够掌握以下内容:

  • .sph 后端脚本文件的基本结构与执行流程
  • 文件被访问() 入口函数的请求路由机制
  • 取请求值("a") 取出 URL 参数并动态执行对应函数
  • 安全验证:通过函数白名单防止非法调用
  • 输出 函数向客户端返回数据
  • 模块化引用:引用 "模块名".sph 之间复用代码
  • 字符串连接 + 的限制(至少一边为字面字符串)
  • 置响应头 设置响应报头
  • 引用 "library/qing.core.php" 引入核心库

涉及关键字与函数

关键字: 引用函数 ... 结束 函数变量如果 ... 否则 ... 结束 如果返回输出

后端专用函数:

函数作用示例
置响应头(报头)设置响应报头置响应头("Content-Type: text/html; charset=utf-8")
取请求值(键名)取出 GET/POST 参数取请求值("a")
为空(值)判断是否为空为空(待执行函数名)
执行函数(函数名)动态执行函数执行函数(待执行函数名)
输出(内容)向客户端输出内容输出 "反馈信息"
取成员是否存在(数组,值)判断数组是否包含值取成员是否存在(列表,函数名)
取现行时间戳()获取当前时间戳取现行时间戳()
格式化时间(格式,时间戳)格式化时间格式化时间("Y-m-d",取现行时间戳())
读文件内容(路径)读取服务器文件读文件内容("/static/ceshi.txt")

语法格式

采用面向过程编写代码,所有语句从上到下依次执行。

示例:Api1.sph

' ****************************************************************************
' 版权说明:Copyright(C) All Rights Reserved VcnStudio
' 程序版本:V1.0
' 文件描述:服务端脚本文件、最终将会编译成 PHP 源代码,
'      可在该文件中操作数据库增删改查、读写服务器中的文件。
' 修改日志:
' ****************************************************************************
' 向客户端发送服务器的响应报头(Response Header)
置响应头("Content-Type: text/html; charset=utf-8")
置响应头("Content-Language: zh-CN")

' 引用轻语言封装的PHP核心库,注:如果要删除该引用请确保当前文件中未使用轻语言封装的函数
引用 "library/qing.core.php"

' 调用主函数:"文件被访问"、即当在任何前端中访问该文件时,地址中不带任何参数名,都将会先调用该函数
文件被访问()

' 入口函数,函数名可自定义命名,主要作用:
' 当本文件被访问时,获取其前端传来的请求参数值,根据请求参数值调用当前文件中的函数
函数 文件被访问()
    ' 通过URL中的键参获取要执行的函数,这里我们默认规定键名为"a",例如:
    ' 前端请求地址为:http://xxx.com/本文件名.php?a=测试输出
    ' 其"a"后面的值"测试输出"即为我们要执行的函数,使用"取请求值"函数将其取出后,然后执行。
    变量 待执行函数名 = 取请求值("a")
    如果(为空(待执行函数名))
        输出 "待执行函数不能为空"
    否则
        ' 增加安全验证,只允许执行我们定义的函数
        变量 可被执行的函数列表 = [ "测试输出", "获取时间" ,"读TXT文件内容"]
        如果(取成员是否存在(可被执行的函数列表,待执行函数名) == 真)
            输出 执行函数(待执行函数名)
        否则
            输出 "请求执行非法的函数"
        结束 如果
    结束 如果
结束 函数

' 在前端通过发送GET、POST请求、或使用"请求接口"函数调用该函数,或直接在浏览器中访问下面地址
' 地址:http://xxx.com/Api.php?a=测试输出
函数 测试输出()
    输出 "你发送的请求接收成功;这是反馈信息!"
结束 函数

' 向前端输出当前格式化后的时间信息
' 地址:http://xxx.com/Api.php?a=获取时间
函数 获取时间()
    输出 "当前时间:" + 格式化时间("Y-m-d",取现行时间戳())
结束 函数

' 向前端输出服务器中指定位置的".txt"文本文件
' 地址:http://xxx.com/Api.php?a=读TXT文件内容
函数 读TXT文件内容()
    输出 "ceshi.txt 内容:" + 读文件内容("/static/ceshi.txt")
结束 函数

' 内部函数,未添加到 可被执行的函数列表 中,因此前端请求时不会执行该函数
函数 内部私有函数()
    返回 "这是内部函数,URL不可访问"
结束 函数

关键代码解读

1. .sph 文件执行流程

置响应头("Content-Type: text/html; charset=utf-8")    ' 1. 设置响应头
引用 "library/qing.core.php"                          ' 2. 引入核心库
文件被访问()                                            ' 3. 调用入口函数(从上到下执行)
  • 文件从上到下顺序执行
  • 先设置响应头、引入核心库,再调用入口函数
  • 入口函数名可自定义,但需在文件顶层调用一次

2. 请求路由:通过 URL 的 a 参数分发

变量 待执行函数名 = 取请求值("a")
如果(为空(待执行函数名))
    输出 "待执行函数不能为空"
否则
    变量 可被执行的函数列表 = [ "测试输出", "获取时间" ,"读TXT文件内容"]
    如果(取成员是否存在(可被执行的函数列表,待执行函数名) == 真)
        输出 执行函数(待执行函数名)
    否则
        输出 "请求执行非法的函数"
    结束 如果
结束 如果
  • 约定 URL 中的 a 参数值为要调用的函数名
  • 例如 ?a=测试输出 将调用 测试输出() 函数
  • 必须使用白名单校验:仅允许执行预定义的函数列表,防止非法调用

3. 安全机制:函数白名单

变量 可被执行的函数列表 = [ "测试输出", "获取时间" ,"读TXT文件内容"]
如果(取成员是否存在(可被执行的函数列表,待执行函数名) == 真)
    输出 执行函数(待执行函数名)
否则
    输出 "请求执行非法的函数"
结束 如果
  • 所有允许通过 URL 调用的函数必须加入白名单数组
  • 未在白名单中的函数(如 内部私有函数)无法通过 URL 访问
  • 取成员是否存在(数组, 值) 判断值是否在数组中

4. 输出与返回

函数 测试输出()
    输出 "你发送的请求接收成功;这是反馈信息!"
结束 函数
  • 输出 内容 将内容作为响应体返回给客户端
  • 返回 值 仅在函数内返回值,不直接输出到客户端
  • 通常入口函数中使用 输出 执行函数(函数名) 将函数返回值输出

变量

与前端定义变量语法完全一致。

代码示例:

' 定义字符串文本变量
变量 页面变量 = "变量定义测试"

' 定义整数变量
变量 X,Y = 0

函数

与前端定义函数的语法完全一致。

代码示例:

' 无参数、无返回值的函数
函数 无返回值函数()
    调试输出("无返回值的函数被执行")
结束 函数

' 有返回值的函数、不需要定义返回类型,只需要在函数中返回值即可,
' 函数中的参数也不需要定义任何数据类型,所有参数默认可接收所有数据类型
函数 有返回值的函数(参数一,参数二)
    返回 参数一 + 参数二
结束 函数

模块化引用、代码复用

轻语言编写的后端脚本文件,最终编译输出为标准单个 .php 脚本文件,因此在轻语言中每个 .sph 可以被独立运行,也可以被引用到其它 .sph 文件中使用。

模块文件示例:Module1.sph

' ****************************************************************************
' 版权说明:Copyright(C) All Rights Reserved VcnStudio
' 程序版本:V1.0
' 文件描述:后端脚本复用封装的函数。
' 修改日志:
' ****************************************************************************
' 注释标记当前文件为模块,提供给IDE做语法分析时自动完成智能提示,不参与编译判断
' @模块 = 真

函数 Module1_取当前格式化时间()
    返回 "当前时间:" + 格式化时间("Y-m-d",取现行时间戳())
结束 函数

函数 Module1_计算加法(参数1,参数2)
    返回 参数1 * 参数2
结束 函数

接口文件示例:App1.sph

' ****************************************************************************
' 版权说明:Copyright(C) All Rights Reserved VcnStudio
' 程序版本:V1.0
' 文件描述:测试模块函数的服务端脚本文件、最终将会编译成 PHP 源代码
' 修改日志:
' ****************************************************************************

' 向客户端发送服务器的响应报头(Response Header)
置响应头("Content-Type: text/html; charset=utf-8")
置响应头("Content-Language: zh-CN")

' 引用轻语言封装的PHP核心库,注:如果要删除该引用请确保当前文件中未使用轻语言封装的函数
引用 "library/qing.core.php"

' 引用项目中的模块脚本文件
引用 "Module1"

' 调用主函数:"文件被访问"、即当在任何前端中访问该文件时,地址中不带任何参数名,都将会先调用该函数
文件被访问()

' 入口函数,函数名可自定义命名,主要作用:
' 当本文件被访问时,获取其前端传来的请求参数值,根据请求参数值调用当前文件中的函数
函数 文件被访问()
    ' 通过URL中的键参获取要执行的函数,这里我们默认规定键名为"a",例如:
    ' 前端请求地址为:http://xxx.com/本文件名.php?a=测试输出
    ' 例如:http://xxx.com/Api1.php?a=取当前格式化时间
    ' 其"a"后面的值"测试输出"即为我们要执行的函数,使用"取请求值"函数将其取出后,然后执行。
    变量 待执行函数名 = 取请求值("a")
    如果(为空(待执行函数名))
        输出 "待执行函数不能为空"
    否则
        如果(待执行函数名 == "取当前格式化时间")
            输出 Module1_取当前格式化时间()
        否则 如果(待执行函数名 == "计算加法")
            如果(为空(取请求值(key1)) 或 为空(取请求值(key2)))
                输出 "目标计算参数获取失败,请确认提交请求时是否传入了key1、key2参数值"
            否则
                输出 Module1_计算加法(10,20)
            结束 如果
        结束 如果
    结束 如果
结束 函数

模块化要点

  • 使用 引用 "模块名" 引入其它 .sph 文件
  • 模块文件建议添加 ' @模块 = 真 注释标记,便于 IDE 识别
  • 模块中的函数通过 模块名_函数名() 的方式调用(约定)
  • 模块函数不会通过 URL 直接访问,需在入口中显式调用

注意事项

  • 字符串连接 + 的限制:原生 PHP 中以 . 连接字符串,在轻语言中可用 + 连接,但必须满足 + 两边至少有一个 Token 为静态字符串常量值(即用双引号括起来的值)。
变量 测试1 = "姓名:" + "张三"  ' 正确合法
变量 年龄 = 23
变量 测试2 = "年龄:" + 年龄  ' 正确合法
变量 前缀= "【签名】"
变量 测试3 = 前缀 + "这是一段字符串,年龄:"  + 年龄  ' 正确合法

变量 水果1 = "苹果"
变量 水果2 = "香蕉"
变量 水果3 = 水果1 + 水果2 ' 错误:两边都不是字面字符串
  • 白名单必须校验:通过 URL 调用的函数必须在白名单中,防止非法调用。
  • 文件被访问 函数名可自定义:入口函数名可以任意命名,但需在文件顶层显式调用。
  • 输出返回 区别输出 直接将内容作为响应返回给客户端;返回 仅在函数内返回值。
  • 核心库引用引用 "library/qing.core.php" 提供轻语言封装的 PHP 函数,若删除需确保未使用这些函数。
  • 模块文件路径引用 "Module1" 不要带扩展名,编译器自动查找 .sph
  • 响应头位置置响应头 必须在任何 输出 之前调用,否则无效。
  • 输出顺序:由于是顺序执行,入口函数调用必须在所有定义之后。

学习要点总结

知识点关键代码适用场景
后端脚本.sph 文件服务端 API
入口函数文件被访问()请求路由
取请求参数取请求值("a")获取 URL 参数
函数白名单取成员是否存在(列表, 名)安全校验
动态执行执行函数(函数名)调用对应函数
输出响应输出 内容返回数据给客户端
设置响应头置响应头(...)Content-Type 等
引用核心库引用 "library/qing.core.php"使用封装函数
引用模块引用 "Module1"代码复用
字符串连接"前缀" + 变量至少一边为字面字符串

相关文档

  • 文档轻语言网站:发送网络请求与接口请求 —— 前端如何请求 .sph 接口
  • 文档轻语言网站:工程项目结构 —— .sph 文件在项目中的位置
  • 文档轻语言网站:轻语言语法速查 —— 函数定义、变量声明语法
  • 文档轻语言网站:变量与数组与对象的定义 —— 变量与函数定义
  • 文档后端(PHP)函数_请求 —— 取请求值 等请求函数
  • 文档后端(PHP)函数_响应 —— 输出/置响应头 等响应函数
  • 文档后端(PHP)函数_时间 —— 取现行时间戳/格式化时间
  • 文档后端(PHP)函数_文件 —— 读文件内容 等文件操作
  • 文档后端(PHP)函数_数组 —— 取成员是否存在 等数组函数
  • 文档综合演示:MySQL数据库操作 —— 后端脚本操作数据库实战
  • 文档综合演示:网页留言板开发 —— 前后端联调实战