Message function
Web 应用程序的 请求方法处理概念 介绍
我们通常在开发一个 Web 应用程序时,比如 PHP 脚本应用程序其代码会是如下这样:
<?php
echo 'hello world!';
?>
上述的 PHP 脚本应用程序简单实现了输出字符串“hello world!”的功能,由于 agine 是基于动态程序的应用平台,所以其应用程序基础结构并非是 PHP 脚本应用程序那样简单。
在 agine web 开发中,每一个页面都是基于一个被命名为“请求方法”的概念。诸如上述 PHP 脚本应用程序一样,我们可以将它另存为 index.php,随后我们在浏览器中访问其路径,即可使其被执行。请求方法所对应的是一个函数实例,其原型为:
int function(int hMessage);
该函数实例的返回值类型为 int 型,通常情况下其返回值有如下几种标志:
| Constant | Value | Notes |
|---|---|---|
| MS_OK | 0x01 | 请求已处理 |
| MS_ERROR | -1 | 请求处理时出现错误 |
| MS_FAIL | -2 | 请求处理失败 |
| MS_REFUSE | -5 | 拒绝请求 |
| MS_NULL | 0x00 | 请求是无效的 |
agine web 为每一个请求均自动创建一个独一无二的请求句柄,并通过请求方法函数实例的 hMessage 参数传入。在您使用到相关 API 时,需要将请求句柄传入,这种方式进而增强了在 agine web 开发中的异步处理能力。在请求方法函数实例返回后该请求句柄将被自动关闭(开发者异或在处理代码中通过使用 CloseMessage function 将其关闭,但这通常是没有必要的)。
值得注意的是,每一个请求方法会在多个外壳线程中被引用,这也就意味着您不能在请求方法函数实例中对公有资源(如:全局变量)进行操作,否则将可能导致应用程序内存访问冲突进而崩溃。根据 agine 开发标准规定,您应在请求方法函数实例中仅操作该函数的私有资源(如:局部变量)。如您要异步访问公有资源,应使用相关的通知机制(如:PostNotify function)进行异步操作,而不是在请求方法函数实例中直接对公有资源进行操作。在 agine web 开发中,请求方法函数实例中引用公有资源的行为一定要规避。
现在,我们将演示如何基于 agine web 而开发诸如上述 PHP 脚本应用程序一样的功能,
- 首先我们应将所需要的头文件包含在 Project 中:
#include <h.studio>
#include <h.message>
Notes:在 agine web 开发中,其大部分 Web 应用程序交互功能均被声明在 h.message 头文件中
- 接着,我们在程序代码中定义并编写一个名为 WebIndex 的请求方法 function 实例,并实现如上述 PHP 脚本应用程序一样的功能:
int WebIndex(int hMessage){
echo("hello world!");
return MS_OK;
}
- 最后,我们应在 hello function 中将我们上述所定义的 WebIndex 请求方法添加进进程运行时公有请求方法管理器中:
int hello(){
// Use the built-in function to add its request method to the public manager
function("index",&WebIndex);
// Process the security exit, and with Wiget suspend the process to continue to provide Web services
if(Wiget(WI_EXIT_PROCESS) == WI_OK){
// exit process...
}
}
上述代码中,我们通过使用内建函数 function 将 WebIndex 加入了 公有请求方法管理器,并与符号 index 相关联。您也可以使用 SetFunction function 来设置,其效果与内建函数一致。
之后,我们将上述代码生成后部署在本地进行测试:
- 在本地部署 agine server 运行环境,并使用默认配置文件 root.conf。其默认监听 80 端口号
- 将上述代码生成为 test.app 并另存为 D:\apps\test.app
- 运行命令提示符(CMD),并执行如下代码来创建一个执行单元:
agine #root.conf 运行命令提示符(CMD),并执行如下代码来打开 agine 终端:
bin\shell在终端中执行如下代码以登陆执行单元(假定为默认用户名与密码):
login -i root;在终端中所显示的反馈“password:”下键入默认的 root 密码 root 并继续执行
在终端中执行如下代码以运行 test.app:
task -r d:\apps\test.app;之后运行浏览器并在其地址栏键入 localhost\test.app\index 并访问
此时,如若正常则浏览器应显示 hello world!
Shell:
agine terminal [Version 1.0.1.1009,101021.1]
SMALLSO Studios. All rights reserved.
localhost > login -i root;
password:root
Security session has been established.
localhost\root > task -r d:\apps\test.app
The creation process is successful
localhost\root > login -e;
Canceled localhost
C++ Code:
#include <h.studio>
#include <h.message>
int home(int hMessage); // Declare the function prototype...
int hello(){
function(&home); // By default, the symbolic name or the symbol name is "." Is the default request method
if(Wiget(WI_EXIT_PROCESS) == WI_OK){
// exit process
}
}
int home(int hMessage){ // URL: http://localhost/test.app
echo("hello world!");
return MS_OK;
}