[服务器请求] 对象是网站请求处理的核心对象。通过它我们可以获取浏览器提交的参数,用户上传的文件和用户的Cookie等信息。
在以下内容中,将使用别名“请求”来表示[服务器请求]。[请求]对象只能在[视图函数]中使用。
获取提交参数的基本方法主要有三个:
在大部分场景中,我们只需要通过[请求.取参数]方法,就能快速获取到各种来源的参数内容。
通过名称获取参数,当参数为[多值参数]时,将返回最后一个参数的内容。
请求中如果同一个名称的参数有多个内容时,我们称之为[多值参数]。例如:
http://127.0.0.1:8080/user/delete?id=1&id=5&id=7
其中名称为“id”的参数,拥有多个值。此时我们可以通过[请求.取多值参数]获取其每一项结果:
x.版本 2.支持库 e2ee.支持库 spec.局部变量 用户ID, 文本型, , "0"用户ID = 请求.取多值参数 (“id”, )调试输出 (用户ID)数组{1, 5, 7}
获取所有请求接收和处理的参数内容。返回数据为[存取键值表]对象。
[取所有参数]返回的[存取键值表],不同于普通的键值表,其生命周期将贯穿本次请求始终。
如果您在[全局函数]中修改了这个[键值表]的值,在接下来的[视图函数]中再次调用[取所有参数]时,得到的将是修改后的内容。
要避免它的内容被改变,您可以通过[键值表.合并到]方法,将参数键值表的数据直接拷贝合并到局部变量中的[键值表]对象中。
xxxxxxxxxx.版本 2.支持库 e2ee.局部变量 所有参数, 存取键值表请求.取所有参数 ().合并到 (所有参数)
通过[取参数]方法可以获取以下来源的参数内容:
这几种参数来源,在同一个请求中,可以同时使用。
浏览器发起请求时,可以通过在网址尾部携带[请求参数(QueryString)]的方式,提交数据给网站。例如以下的网址:
https://www.baidu.com/s?wd=E2EE&from=mobile
其中“wd”和“from”就是[请求参数],内容为要查询的数据“E2EE”和来源内容“mobile”。
我们在[视图函数]中,可以通过以下方式直接获取到结果。
xxxxxxxxxx请求.取参数("wd")E2EE
在网址尾部以“?”开头
名称和内容之间通过“=”进行分割
多个参数之间通过“&”进行分割
名称或内容不为ASCII的时候必须进行[URL编码]操作
以下为正确的[请求参数]格式
/user/detail?id=5
/user/detail?id=5&id=3
/echo?name=JimStone&sex=%E7%94%B7%E5%AD%A9&age=18
以下为错误的[请求参数]格式
/user/detail&id=5 必须以“?”开始
/user/detail?id=5?id=3 多个参数之间必须用“&”进行分割且“?”也只能使用一次
/echo?name=JimStone&sex=男孩&age=18 非ASCII没有进行[URL编码]操作(浏览器通常会自动编码)
xxxxxxxxxx.版本 2.支持库 e2ee.支持库 internet.子程序 _启动服务器_提交参数_请求参数.局部变量 server, 网站服务器server.订阅视图函数 (&提交参数_视图_请求参数, “/s”, , )server.启动 (创建键值表 (#配置项_端口, 8080), )运行 (创建文本 (“explorer ''http://127.0.0.1:8080/s?wd=E2EE&from=mobile''”, ), 假, )server.等待结束 (假).子程序 提交参数_视图_请求参数, 逻辑型.参数 请求对象地址, 整数型.参数 响应对象地址, 整数型.局部变量 请求, 服务器请求.局部变量 响应, 服务器响应取回请求对象 (请求对象地址, 响应对象地址, 请求, 响应)输出调试文本 (请求.取参数 (“wd”, ))输出调试文本 (请求.取参数 (“from”, ))返回 (响应.写出成功 (, 请求.取所有参数 (), ))E2EE
mobile
[请求参数]中的内容不建议过长,因为通常服务器会限制网址的长度,如果网址过长可能会造成请求失败,通常建议网址的内容控制在1024字节以内。过长的内容建议改用POST/PUT等[提交参数]的方式进行提交。
在[网站服务器]对象中,使用[订阅视图函数]订阅路由网址的时候,在路由网址中加入的变量,我们称为[路由参数]。
例如:
xxxxxxxxxx网站.订阅视图函数 (&提交参数_视图_路由参数,“/user/detail/:id”)
其中“id”就是我们[路由参数]的名称。当浏览器输入以下网址时:
/user/detail/1211
我们在[视图函数]“提交参数视图路由参数”中,可以直接通过[取参数]获取到内容:
xxxxxxxxxx请求.取参数 (“id”)1211
xxxxxxxxxx.版本 2.支持库 e2ee.支持库 internet.子程序 _启动服务器_提交参数_路由参数.局部变量 server, 网站服务器server.订阅视图函数 (&提交参数_视图_路由参数, “/user/detail/:id”, , )server.启动 (创建键值表 (#配置项_端口, 8080), )运行 (创建文本 (“explorer ''http://127.0.0.1:8080/user/detail/1211''”, ), 假, )server.等待结束 (假).子程序 提交参数_视图_路由参数, 逻辑型.参数 请求对象地址, 整数型.参数 响应对象地址, 整数型.局部变量 请求, 服务器请求.局部变量 响应, 服务器响应取回请求对象 (请求对象地址, 响应对象地址, 请求, 响应)输出调试文本 (请求.取参数 (“id”, ))返回 (响应.写出成功 (, 请求.取所有参数 (), ))1211
在网页中,设置表单(form)的请求类型(method)为“POST”或“PUT”类型时,所有提交的参数都叫做[提交参数]。通常用于文件上传、多参数 和 大尺寸参数数据的内容提交。
xxxxxxxxxx.版本 2.支持库 e2ee.子程序 _启动服务器_提交参数_提交参数.局部变量 http, 网站客户端.局部变量 网站, 网站服务器网站.订阅视图函数 (&提交参数_视图_提交参数, “/”, , )网站.启动 (创建键值表 (#配置项_端口, 8080, #配置项_编码, #文本编码格式_UTF8), )http.置编码 (#文本编码格式_UTF8)http.执行POST (“http://127.0.0.1:8080/”, 创建键值表 (“name”, “JimStone”, “age”, 18), , 真, )网站.等待结束 (假).子程序 提交参数_视图_提交参数, 逻辑型.参数 请求对象地址, 整数型.参数 响应对象地址, 整数型.局部变量 请求, 服务器请求.局部变量 响应, 服务器响应取回请求对象 (请求对象地址, 响应对象地址, 请求, 响应)输出调试文本 (请求.取参数 (“name”, ))输出调试文本 (请求.取参数 (“age”, ))返回 (响应.写出成功 (, 请求.取所有参数 (), ))JimStone
18
要理解[提交参数]需要先理解下[HTTP请求头]中的“Content-Type”。
在请求中,Content-Type请求头会告诉服务器,实际提交内容的内容类型。
Content-Type包含3部分:
Chrome等浏览器中提交表单时,通常会自动指定“charset”为“UTF-8”。E2EE允许客户端通过自己的编码格式来提交数据,而在非浏览器环境中执行“POST/PUT”请求时,请务必设置“charset”或者将内容转换为和网站一致的编码格式,否则服务器接收到的数据可能会转码失败导致数据出错。
典型的定义:
Content-Type: application/x-www-form-urlencoded; charset=utf-8
网站服务器支持的“media-type”类型:
不同类型的内容实际处理方式也将完全不同。在E2EE中,不需要过于关注这些类型,因为我们都可以通过 [请求.取参数] 或 [请求.取所有参数] 获取。
提交的数据需要进行[URL编码]处理(浏览器会自动处理),格式跟上文中提到的[请求参数]格式完全一致。
多值的参数,常用于文件上传操作。使用时必须要指定“boundary”(浏览器会自动处理)用来作为值之间的分隔符。使用[网站客户端]上传文件时,也不需要手动处理,客户端会自动处理这部分信息。
JSON类型的内容。当识别到这种格式时,服务器对象会自动将JSON内容解析为[存取键值表](必须是以“{}”包裹的JSON内容否则无法处理)。通过[取所有参数]可以直接获取解析后的内容。如果是Array类型的JSON(以“[]”包裹的内容),您可以使用[请求.取原始请求数据]方法获取内容,手动调用[存取列表.从JSON载入]方法加载内容。
text/xml
XML类型的内容。目前服务器并不会自动解析XML内容,您可以使用[请求.取原始请求数据]方法获取内容,配合[网页内容解析器]对象进行XML结果的提取。
如果使用[网站客户端]对象,请务必使用[网站客户端.置编码]设置编码格式,或者保持数据编码和服务器设置一致。
服务器只接收指定了“Content-Length”请求头的[提交参数]。如果您在非浏览器环境中,使用的不是[网站客户端]对象时,如果请求失败,请检查“Content-Length”请求头是否正常。
辅助获取提交参数的方法:
用来判断某个名称的参数是否存在。可以通过指定[是否判断值]参数,来指定空值时参数算不算为[存在]状态。
获取上传文件和上传文件相关的信息。在后边的上传文件部分会有详细介绍。
当网站默认的请求参数处理和获取方式,无法满足您的需求时,可以使用[请求.取原始提交数据]方法获取原始提交数据内容。
[注意] 内容类型为“multipart/form-data”时,您是无法通过此方法获取原始数据的,只能通过 [请求.取参数] 或 [请求.取所有参数] 方法获取参数结果。
HTTP请求消息实际包含三部分内容:
以下是一个典型的GET请求消息:
xxxxxxxxxxGET /index.html HTTP/1.1Host: e2ee.jimstone.com.cnConnection: keep-aliveUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36Accept: text/html,*/*Cookie: Hm_lpvt_d7226ebcc9abfc26c2c62d88f18782fe=1564361737HTTP请求消息中首行为[请求行]。
GET /index.html HTTP/1.1
其中:
[请求类型] GET
[请求路径] /index.html
[协议版本] HTTP/1.1
第二行开始,均为[请求头]信息。
获取当前请求的类型,HTTP1.1协议中支持的方法类型:
GET
取请求的相对路径。
/index.html
获取用户请求版本号信息。本方法返回[协议版本]“HTTP/”后的内容。目前支持“1.0”和“1.1”。
1.1
取回指定名称的请求头:
xxxxxxxxxx请求.取请求头 ("Host")
e2ee.jimstone.com.cn
取回所有请求头:
xxxxxxxxxx请求.取所有请求头 ()
xxxxxxxxxx{Host: e2ee.jimstone.com.cnConnection: keep-aliveUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36Accept: text/html,*/*Cookie: Hm_lpvt_d7226ebcc9abfc26c2c62d88f18782fe=1564361737}
当同一个名称的请求头有多个时,只保留最后一个。
返回请求部分的原始内容:
xxxxxxxxxx请求.取原始请求头 ()
xxxxxxxxxxGET /index.html HTTP/1.1Host: e2ee.jimstone.com.cnConnection: keep-aliveUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36Accept: text/html,*/*Cookie: Hm_lpvt_d7226ebcc9abfc26c2c62d88f18782fe=1564361737
获取用户客户端地址(IP) 和 端口 的方法:
在使用Nginx等代理方式访问网站时,您需要在代理中配置“X-real-ip”或者“X-Forward-For”请求头,将原用户地址写入到对应的请求头中。而在网站配置中,您需要在[真实IP请求头]配置项填入代理中配置的请求头名称。
判断当前请求是否为手机用户的方法:
判断是否存在“X-Wap-Profile”请求头,存在则为手机用户。
判断请求头“User-Agent”是否能匹配手机用户的关键字表达式。
Cookie是HTTP会话中,通过浏览器保存用户信息的一种方式。
Cookie是明文公开的,正常环境下不适合存储任何私密信息。Cookie有被篡改的风险,如果您需要存储当前用户信息,并且不想被浏览器查看到或恶意串改,请使用Session。
Cookie的存储周期是可以手动指定的,且开启多个浏览器窗口时,Cookie是共享的。在指定Cookie存储周期时,关闭和重启浏览器,不会对Cookie存储的数据产生影响,通常下次启动后会继续沿用之前的Cookie数据。
本方法会返回存储有当前用户Cookies的[存取键值表]对象。其中[主键]为Cookie的名称,[值]为Cookie内容。
当同名称同路径下的Cookie有多个值的时候(通常浏览器不会发送同名多值Cookie),只会保留最后一个Cookie内容。
Session是在HTTP会话中,将用户信息保留在服务端的一种方式。默认情况下,用户关闭浏览器后,Session会被自动清空。
Session常用于存储用户登录状态、权限和操作流程状态等信息。
Session是基于Cookie机制实现的。当设置Cookie时,不指定存储周期时,Cookie内容只会保留在内存中。当浏览器关闭后,对应的Cookie将不再存在。Session就是基于这个特性,通过生成一段随机内容的[ID],将其存储在Cookie中做为读写数据的钥匙,从而实现在服务端保存用户会话数据的。
获取用户的Session的ID。这段ID是服务器随机生成的,通过随机算法和命中判断,保证生成后[ID]的唯一性(不存在生成重复ID的可能)。
通过[主键]名称设置Session内容文本。主键名称可以为任意文本。如果不指定[值文本]参数,将删除[主键]对应的Session值。
返回[主键]名称获取Session内容文本。主键不存在返回[空]文本。
清空当前用户的所有Session值内容。
您可以在 [E2EE控制中心] > [配置] > [Session设置] 中指定Session的过期时间。
在满足以下任意条件时会触发Session自动续期操作:
自动续期操作会重置Session的过期时间,为网站配置项[SESSION时间]指定时间周期。
上传文件是网站中常用的功能,在E2EE中针对上传的文件的大致处理流程如下:
上传通常可以使用 [网站.移动文件],将上传后的临时文件移动到网站相关的目录中。
xxxxxxxxxx.版本 2.支持库 e2ee.子程序 _启动服务器_文件上传_上传文件, , 生成上传表单页面(仅用于演示)。实际使用通常用在[模板]或者[静态文件]中.局部变量 网站, 网站服务器网站.订阅视图函数 (&文件上传_视图_首页, "/", , )网站.订阅视图函数 (&文件上传_视图_上传, "/upload", , )网站.启动 (创建键值表 (#配置项_端口, 8080, #配置项_编码, #文本编码格式_UTF8, #配置项_提交参数尺寸, 20480), )运行 (创建文本 (“explorer ''http://127.0.0.1:8080/''”, ), 假, )网站.等待结束 (假).子程序 文件上传_视图_首页, 逻辑型, , 移动上传文件到上传目录下.参数 请求对象地址, 整数型.参数 响应对象地址, 整数型.局部变量 请求, 服务器请求.局部变量 响应, 服务器响应.局部变量 内容, 存取列表取回请求对象 (请求对象地址, 响应对象地址, 请求, 响应)内容.添加值 ("<html>")内容.添加值 ("<head><title>[E2EE] 上传文件</title></head>")内容.添加值 ("<body>")内容.添加值 (创建文本 ("<form method=''POST'' action=''/upload'' enctype=''multipart/form-data''>", ))内容.添加值 ("<h1>选择图片</h1>")内容.添加值 (创建文本 ("<input type=''file'' name=''img''/>", ))内容.添加值 (创建文本 ("<input type=''submit'' value=''上传'' />", ))内容.添加值 ("</form>")内容.添加值 ("</body>")内容.添加值 ("</html>")响应.写出文本 (内容.连接文本 (#换行符))返回 (真).子程序 文件上传_视图_上传, 逻辑型.参数 请求对象地址, 整数型.参数 响应对象地址, 整数型.局部变量 请求, 服务器请求.局部变量 响应, 服务器响应.局部变量 目录, 文本型.局部变量 临时, 文本型, , , 上传后的临时文件路径.局部变量 文件, 文本型, , , 保存后的上传文件路径取回请求对象 (请求对象地址, 响应对象地址, 请求, 响应)目录 = 路径_合并 (请求.取配置项 (#配置项_网页), "/uploads/")临时 = 请求.上传文件_取上传文件路径 ("img")文件 = 路径_合并 (目录, 路径_取名称 (临时, 真)).如果真 (取文本长度 (临时) = 0) ' // 上传失败(路径为空) 响应.写出文本 ("上传失败!") 返回 (假).如果真结束.如果真 (路径_是否为目录 (目录) = 假) ' // 创建上传目录失败 创建目录 (目录).如果真结束.如果真 (移动文件 (临时, 文件) = 假) ' // 移动保存文件失败 响应.写出文本 ("保存失败!") 返回 (假).如果真结束响应.发送文件 (路径_合并 ("/uploads/", 路径_取名称 (文件, 真)))返回 (真)
通过表单名,获取用户上传后的文件的绝对路径(通常在[临时目录]下)。如果要使用该文件请移动到需要的地方,未移动的文件在请求处理完成后将自动删除。
通过表单名获取上传文件信息。数据将被写入到[文件信息]参数指定的[存取键值表]变量中,[键值表]的主键可以使用“#上传主键_”常量获取对应内容。
取所有上传的文件信息列表。返回文件列表的数量。文件信息会被写入[上传文件列表]参数指定的[存取列表]对象中。[存取列表]内的每一项都为[存取键值表]类型,其主键可以使用“#上传主键_”常量,获取对应上传文件详细信息。
可以通过订阅全局函数的方式,在文件上传开始时控制上传流程:
当文件上传失败时,也可以通过订阅全局函数来获取失败时的信息:
xxxxxxxxxx.版本 2.支持库 e2ee.子程序 _启动服务器_文件上传_流程控制.局部变量 网站, 网站服务器网站.订阅全局函数 (&文件上传_流程控制_全局_开始上传, #全局函数_上传文件)网站.订阅视图函数 (&文件上传_流程控制_视图_首页, “/”, , )网站.订阅视图函数 (&文件上传_流程控制_视图_上传, “/upload”, , )网站.启动 (创建键值表 (#配置项_端口, 8080, #配置项_编码, #文本编码格式_UTF8), )运行 (创建文本 (“explorer ''http://127.0.0.1:8080/''”, ), 假, )网站.等待结束 (假).子程序 文件上传_流程控制_全局_开始上传, 逻辑型.参数 请求对象地址, 整数型.参数 响应对象地址, 整数型.局部变量 请求, 服务器请求.局部变量 响应, 服务器响应.局部变量 文件路径, 文本型.局部变量 文件名, 文本型.局部变量 表单名, 文本型.局部变量 文件尺寸, 长整数型.局部变量 上传状态, 整数型.局部变量 目录, 文本型.局部变量 文件, 文本型取回请求对象 (请求对象地址, 响应对象地址, 请求, 响应)' // 获取正在上传文件信息请求.上传文件_取当前文件信息 (文件路径, 文件名, 表单名, 文件尺寸, 上传状态)输出调试文本 (创建文本 (“==== [正在上传] ====\r\n 文件路径: {1}\r\n 文件名: {2}\r\n 表单名: {3}\r\n 文件尺寸: {4}\r\n 上传状态: {5}\r\n ”, 文件路径, 文件名, 表单名, 文件尺寸, 上传状态))' // 重写文件路径目录 = 路径_合并 (请求.取配置项 (#配置项_网页), “/uploads/”)文件 = 路径_合并 (目录, 路径_取名称 (文件路径, 真)).如果真 (路径_是否为目录 (目录) = 假) ' // 创建上传目录失败 创建目录 (目录).如果真结束请求.上传文件_置当前文件路径 (文件)' // 以下函数可以控制上传处理流程' 请求.上传文件_终止文件上传 ()' 请求.上传文件_跳过当前文件 ()返回 (真).子程序 文件上传_流程控制_视图_首页, 逻辑型, , 生成上传表单页面(仅用于演示)。实际使用通常用在[模板]或者[静态文件]中.参数 请求对象地址, 整数型.参数 响应对象地址, 整数型.局部变量 请求, 服务器请求.局部变量 响应, 服务器响应.局部变量 内容, 存取列表取回请求对象 (请求对象地址, 响应对象地址, 请求, 响应)内容.添加值 (“<html>”)内容.添加值 (“<head><title>[E2EE] 上传文件</title></head>”)内容.添加值 (“<body>”)内容.添加值 (创建文本 (“<form method=''POST'' action=''/upload'' enctype=''multipart/form-data''>”, ))内容.添加值 (“<h1>选择图片</h1>”)内容.添加值 (创建文本 (“<input type=''file'' name=''img''/>”, ))内容.添加值 (创建文本 (“<input type=''submit'' value=''上传'' />”, ))内容.添加值 (“</form>”)内容.添加值 (“</body>”)内容.添加值 (“</html>”)响应.写出文本 (内容.连接文本 (#换行符))返回 (真).子程序 文件上传_流程控制_视图_上传, 逻辑型, , 移动上传文件到上传目录下.参数 请求对象地址, 整数型.参数 响应对象地址, 整数型.局部变量 请求, 服务器请求.局部变量 响应, 服务器响应.局部变量 目录, 文本型.局部变量 文件, 文本型, , , 保存后的上传文件路径取回请求对象 (请求对象地址, 响应对象地址, 请求, 响应)文件 = 请求.上传文件_取上传文件路径 (“img”).如果真 (取文本长度 (文件) = 0) 响应.写出文本 (“上传失败!”) 返回 (真).如果真结束输出调试文本 (创建文本 (“[输出路径] {1}”, 文件))响应.发送文件 (文件)返回 (真)
- ==== [正在上传] ==== 文件路径: C:/示例代码/临时/9084_10475.jpg 文件名: QQ图片20181026165329.jpg 表单名: img 文件尺寸: 0 上传状态: 0
- [输出路径] C:/示例代码/uploads/9084_10475.jpg
当使用[请求.上传文件_取上传文件信息]或[请求.上传文件_取所有上传文件]时,在文件信息的[存取键值表]中,可以通过以下常量做为[主键]获取上传文件的信息:
#上传主键_状态
#上传主键_代码
#上传主键_表单名称
#上传主键_原文件名
#上传主键_上传路径
#上传主键_错误原因
其中通过[主键]为“#上传主键_代码”常量时,对应的值,可以通过和以下常量做比较获取具体原因:
#上传代码_成功
#上传代码_未开启上传
#上传代码_文件尺寸过大
#上传代码_不允许的类型
#上传代码_无法写入文件
#上传代码_无上传文件
#上传代码_上传被取消
在 [全局函数]、[视图函数] 到 [后置全局函数] 之间,经常需要进行数据的传递。可以通过以下方法进行数据传递:
[属性表] 是一种特殊的 [存取键值表],在同一次的请求处理过程中,无论是 [全局函数]、[视图函数] 还是 [后置全局函数],通过 [请求.属性表] 得到的都是同一个键值表。
您可以通过对 [属性表] 的读取和赋值操作,在各个流程之间传递数据。
[属性表] 在任何环境下,都将自动用做模板渲染时的[模板数据]。所以您可以通过写入数据到[属性表],直接输出要渲染的数据到最终模板中。
xxxxxxxxxx.版本 2.支持库 e2ee.子程序 _启动服务器_传递数据_属性表.局部变量 网站, 网站服务器网站.订阅全局函数 (&传递数据_属性表_全局, )网站.订阅视图函数 (&传递数据_属性表_视图_首页, “/”, , )网站.启动 (创建键值表 (#配置项_端口, 8080, #配置项_编码, #文本编码格式_UTF8), )运行 (创建文本 (“explorer ''http://127.0.0.1:8080/''”, ), 假, )网站.等待结束 (假).子程序 传递数据_属性表_全局, 逻辑型.参数 请求对象地址, 整数型.参数 响应对象地址, 整数型.局部变量 请求, 服务器请求.局部变量 响应, 服务器响应.局部变量 属性表, 存取键值表取回请求对象 (请求对象地址, 响应对象地址, 请求, 响应)属性表 = 请求.属性表 ()属性表.置文本 (“标题”, “E2EE是最棒的”)返回 (真).子程序 传递数据_属性表_视图_首页, 逻辑型.参数 请求对象地址, 整数型.参数 响应对象地址, 整数型.局部变量 请求, 服务器请求.局部变量 响应, 服务器响应.局部变量 属性表, 存取键值表取回请求对象 (请求对象地址, 响应对象地址, 请求, 响应)属性表 = 请求.属性表 ()输出调试文本 (属性表.取文本 (“标题”))' // 输出JSON响应.置文档类型按后缀 (“json”)响应.写出文本 (属性表.到JSON (假, , ))返回 (真)E2EE是最棒的
[函数标签] 是网站流程处理的拦截过滤器。当 [视图函数] 和 [全局函数] 拥有相同的[标签]时,在执行视图前,会优先调用[全局函数]。
函数标签的适用场景:
xxxxxxxxxx.版本 2.支持库 e2ee.子程序 _启动服务器_函数标签.局部变量 网站, 网站服务器网站.订阅全局函数 (&全局_登录验证, “登录”)网站.订阅全局函数 (&全局_等级验证, “等级”)网站.订阅视图函数 (&视图_首页, “/”, , )网站.订阅视图函数 (&视图_用户登录, “/login”, , )网站.订阅视图函数 (&视图_用户退出, “/logout”, , “登录”)网站.订阅视图函数 (&视图_用户信息, “/user”, , “登录”, “等级”)网站.启动 (创建键值表 (#配置项_端口, 8080, #配置项_编码, #文本编码格式_UTF8), )运行 (创建文本 (“explorer ''http://127.0.0.1:8080/''”, ), 假, )网站.等待结束 (假).子程序 全局_登录验证, 逻辑型, , 验证用户是否已经登录.参数 请求对象地址, 整数型.参数 响应对象地址, 整数型.局部变量 请求, 服务器请求.局部变量 响应, 服务器响应取回请求对象 (请求对象地址, 响应对象地址, 请求, 响应)' // 判断用户是否已经登录.如果真 (请求.取Session值 (“是否登录”) ≠ “1”) 响应.写出文本 (“<h1>[登录验证] 用户未登录</h1>”) 返回 (假) ' // 终止请求继续处理.如果真结束' // 注入信息请求.属性表 ().置值 (“框架名称”, “E2EE”)返回 (真).子程序 全局_等级验证, 逻辑型, , 验证用户等级.参数 请求对象地址, 整数型.参数 响应对象地址, 整数型.局部变量 请求, 服务器请求.局部变量 响应, 服务器响应取回请求对象 (请求对象地址, 响应对象地址, 请求, 响应)' // 判断用户是否为2级以上的用户.如果真 (到数值 (请求.取Session值 (“用户等级”)) < 2) 响应.写出文本 (“<h1>[等级验证] 用户等级在2级以上才能查看信息</h1>”) 返回 (假) ' // 终止请求继续处理.如果真结束返回 (真).子程序 视图_首页, 逻辑型.参数 请求对象地址, 整数型.参数 响应对象地址, 整数型.局部变量 请求, 服务器请求.局部变量 响应, 服务器响应.局部变量 网页, 存取列表取回请求对象 (请求对象地址, 响应对象地址, 请求, 响应)' // 输出链接网页.添加值 (创建文本 (“<a href=''/user'' target=''_blank''>用户信息</a><br/>”, ))网页.添加值 (创建文本 (“<a href=''/logout''>退出登录</a><br/>”, ))网页.添加值 (创建文本 (“登录状态:{1}<br/>”, 选择 (请求.取Session值 (“是否登录”) = “1”, “已登录”, “未登录”)))' // 表格网页.添加值 (创建文本 (“<h2>用户登录</h2>”, ))网页.添加值 (创建文本 (“<form method=''POST'' action=''/login'' target=''_blank'' enctype=''application/x-www-form-urlencoded''>”, ))网页.添加值 (创建文本 (“用户等级:<select name=''level''><option value=''1''>1</option><option value=''2''>2</option></select><br/>”, ))网页.添加值 (创建文本 (“用户名称:<input type=''text'' name=''name''/><br/>”, ))网页.添加值 (创建文本 (“<input type=''submit'' value=''登录''/>”, ))网页.添加值 (“</form>”)响应.写出文本 (网页.连接文本 (“”))返回 (真).子程序 视图_用户登录, 逻辑型.参数 请求对象地址, 整数型.参数 响应对象地址, 整数型.局部变量 请求, 服务器请求.局部变量 响应, 服务器响应.局部变量 用户名称, 文本型.局部变量 用户等级, 整数型取回请求对象 (请求对象地址, 响应对象地址, 请求, 响应)用户名称 = 请求.取参数 (“name”, )用户等级 = 到数值 (请求.取参数 (“level”, ))' // 验证用户名.如果真 (取文本长度 (用户名称) = 0) 响应.写出文本 (“<h1>[用户登录] 用户名称不能为空</h1>”) 返回 (假).如果真结束' // 写到SESSION请求.置Session值 (“是否登录”, “1”)请求.置Session值 (“用户名称”, 用户名称)请求.置Session值 (“用户等级”, 到文本 (用户等级))' // 跳转到用户信息页响应.重定向 (“/user”, 假, 真)返回 (真).子程序 视图_用户退出, 逻辑型.参数 请求对象地址, 整数型.参数 响应对象地址, 整数型.局部变量 请求, 服务器请求.局部变量 响应, 服务器响应取回请求对象 (请求对象地址, 响应对象地址, 请求, 响应)请求.清空Session值 ()响应.重定向 (“/”, 假, 真)返回 (真).子程序 视图_用户信息, 逻辑型.参数 请求对象地址, 整数型.参数 响应对象地址, 整数型.局部变量 请求, 服务器请求.局部变量 响应, 服务器响应.局部变量 网页, 存取列表.局部变量 属性表, 存取键值表取回请求对象 (请求对象地址, 响应对象地址, 请求, 响应)属性表 = 请求.属性表 ()网页.添加值 (“<h1>用户信息</h1>”)网页.添加值 (创建文本 (“<h2>用户名称</h2><h3>{1}</h3>”, 请求.取Session值 (“用户名称”)))网页.添加值 (创建文本 (“<h2>用户等级</h2><h3>{1}</h3>”, 请求.取Session值 (“用户等级”)))网页.添加值 (创建文本 (“<h2>框架名称</h2><h3>{1}</h3>”, 属性表.取文本 (“框架名称”)))响应.写出文本 (网页.连接文本 (“”))返回 (真)获取[视图函数]绑定的标签列表。返回的列表为只读,请不要做添加删除等操作。如果需要修改使用此列表,请使用复制方法。
判断视图函数是否绑定了指定名称的标签。
在 [控制中心] 中使用 [定义远程服务] 工具,可以配置远程服务功能。
在 [控制中心] 中,可以使用 [视图表单验证器] 或者 [远程服务验证器]工具,对路由地址进行参数验证规则的设置。
做为 [容器化] 的 [模块] 使用时,可以使用以下方法获取模块路径:
取服务器在容器中的相对路径,尾部不包含“/”。当在[主服务器]中使用时,返回空文本。
请求对象提供了数据库操作的快捷方法,可以使用 “请求.数据库_” 开头的方法,作用等同于把 [请求]对象 当 [数据库连接]对象 使用。
要使用数据库快捷方法,请确保您在网站初始化时,执行过 [数据库连接池.创建] 方法,并成功绑定到了您的 [网站]对象 中。
当您的 [网站]对象 还没有跟 [数据库连接池]对象 进行绑定时,所有的“请求.数据库_”快捷方法都将返回失败。
相关方法:
详细使用方法可以查看[数据库]文档。
请求中的数据库方法组并不适用于需要使用“事务”的场景,如果您需要用到“事务”特性,请使用 [请求.数据库_取连接] 取回连接后,通过[数据库连接]对象进行数据库事务处理。
请求对象提供了对象映射功能的快捷方法,可以使用 “请求.对象映射_” 开头的方法,作用等同于把 [请求]对象 当 [对象映射中心]对象 使用。
使用前请确保您已经配置好了[对象映射]相关的信息。
相关方法:
详细使用方法可以查看[对象映射]文档。
| 请求头 | 解释 | 示例 |
|---|---|---|
| Accept | 指定客户端能够接收的内容类型 | Accept: text/plain, text/html |
| Accept-Charset | 浏览器可以接受的字符编码集。 | Accept-Charset: iso-8859-5 |
| Accept-Encoding | 指定浏览器可以支持的web服务器返回内容压缩编码类型。 | Accept-Encoding: compress, gzip |
| Accept-Language | 浏览器可接受的语言 | Accept-Language: en,zh |
| Accept-Ranges | 可以请求网页实体的一个或者多个子范围字段 | Accept-Ranges: bytes |
| Authorization | HTTP授权的授权证书 | Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
| Cache-Control | 指定请求和响应遵循的缓存机制 | Cache-Control: no-cache |
| Connection | 表示是否需要持久连接。(HTTP 1.1默认进行持久连接) | Connection: close |
| Cookie | HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。 | Cookie: $Version=1; Skin=new; |
| Content-Length | 请求的内容长度 | Content-Length: 348 |
| Content-Type | 请求的与实体对应的MIME信息 | Content-Type: application/x-www-form-urlencoded |
| Date | 请求发送的日期和时间 | Date: Tue, 15-Nov-17 08:12:31 GMT |
| Expect | 请求的特定的服务器行为 | Expect: 100-continue |
| From | 发出请求的用户的Email | From: user@email.com |
| Host | 指定请求的服务器的域名和端口号 | Host: www.jimstone.com.cn |
| If-Match | 只有请求内容与实体相匹配才有效 | If-Match: “737060cd8c284d8af7ad3082f209582d” |
| If-Modified-Since | 如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回304代码 | If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT |
| If-None-Match | 如果内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断是否改变 | If-None-Match: “737060cd8c284d8af7ad3082f209582d” |
| If-Range | 如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。参数也为Etag | If-Range: “737060cd8c284d8af7ad3082f209582d” |
| If-Unmodified-Since | 只在实体在指定时间之后未被修改才请求成功 | If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT |
| Max-Forwards | 限制信息通过代理和网关传送的时间 | Max-Forwards: 10 |
| Pragma | 用来包含实现特定的指令 | Pragma: no-cache |
| Proxy-Authorization | 连接到代理的授权证书 | Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
| Range | 只请求实体的一部分,指定范围 | Range: bytes=500-999 |
| Referer | 先前网页的地址,当前请求网页紧随其后,即来路 | Referer: http://www.jimstone.com.cn/english/ |
| TE | 客户端愿意接受的传输编码,并通知服务器接受接受尾加头信息 | TE: trailers,deflate;q=0.5 |
| Upgrade | 向服务器指定某种传输协议以便服务器进行转换(如果支持) | Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11 |
| User-Agent | User-Agent的内容包含发出请求的用户信息 | User-Agent: Mozilla/5.0 (Linux; X11) |
| Via | 通知中间网关或代理服务器地址,通信协议 | Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1) |
| Warning | 关于消息实体的警告信息 | Warn: 199 Miscellaneous warning |