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 来设置,其效果与内建函数一致。


之后,我们将上述代码生成后部署在本地进行测试:

  1. 在本地部署 agine server 运行环境,并使用默认配置文件 root.conf。其默认监听 80 端口号
  2. 将上述代码生成为 test.app 并另存为 D:\apps\test.app
  3. 运行命令提示符(CMD),并执行如下代码来创建一个执行单元agine #root.conf
  4. 运行命令提示符(CMD),并执行如下代码来打开 agine 终端bin\shell

  5. 终端中执行如下代码以登陆执行单元(假定为默认用户名与密码):login -i root;

  6. 终端中所显示的反馈“password:”下键入默认的 root 密码 root 并继续执行

  7. 终端中执行如下代码以运行 test.apptask -r d:\apps\test.app;

  8. 之后运行浏览器并在其地址栏键入 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;
}

results matching ""

    No results matching ""