轻语言网站:服务端脚本程序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数据库操作—— 后端脚本操作数据库实战 - 文档
综合演示:网页留言板开发—— 前后端联调实战