Web 请求与函数

在 Gliimly 中,没有您可能在其他语言中习惯的“函数”或“方法”。任何封装都是请求处理程序 - 您可以将其视为执行以处理请求的简单函数 - 可以从外部调用者(例如 Web 浏览器、Web API 或命令行)或从其他处理程序调用它。

同样,这里没有您可能习惯的形式参数。相反,有命名参数,基本上是名称/值对,您可以在请求执行期间的任何地方设置或获取它们。此外,您的请求处理程序可以处理请求主体、环境变量、特定请求方法等(请参阅请求)。不过,在这里,我们只关注参数。

您将使用 set-param 设置参数,然后可以在当前请求中的任何位置获取该参数,包括当前处理程序的调用方或被调用方。使用 get-param 获取使用 set-param 设置的参数。

参数非常快 - 它们是在编译时实现的静态产物,这意味着只使用固定的内存位置来存储它们(从而实现出色的 CPU 缓存),并且任何基于名称的解析仅在必要时使用,并且始终使用快速哈希表和静态缓存。

从另一个处理程序调用一个处理程序

在本文中,我们将讨论用于从另一个处理程序中调用一个处理程序的 call-handler。

这里您将看到一些在请求处理程序之间传递输入和输出参数的示例。这些处理程序都在应用程序的同一进程中运行(请注意,应用程序可以运行多个并行工作的进程)。首先,创建一个应用程序:

mkdir param
cd param
gg -k param

稍后您还将使用下面的代码创建两个源文件(“local.gliim”和“some.gliim”)。

简单服务

让我们从一个简单的服务开始,该服务根据时区提供当前时间作为输入参数(在文件“local.gliim”中):

begin-handler /local/time
    get-param tzone // get time zone as input parameter (i.e. "EST", "MST", "PST" etc.)
    get-time to curr_time timezone tzone
    @
Current time is <>
end-handler

在这种情况下,输出的是 HTML 代码。制作应用程序:

gg -q --public

并从命令行运行它(就像从 Web 浏览器调用它一样):

gg -r --req="/local/time" --silent-header --exec

结果如下:

Current time is Mon, 02 Dec 2024 16:27:03 EST

从另一个调用请求,示例 #1

在此示例中,一个请求处理程序使用调用处理程序从应用程序的同一进程中调用另一个请求处理程序。

例如,下面是调用上述“/local/time”服务的调用者代码(在文件“some.gliim”中):

begin-handler /some/service
    set-param tzone="EST" // set the input parameter to be obtained by /local/time handler
    call-handler "/local/time"
end-handler

在这种情况下,“/local/time”的输出将简单地变成“/some/service”的输出(并且可能被发送到像网络浏览器这样的客户端)。

但是,您也可以使用 set-param 将字符串返回给调用者 - 这是重新设计的“/local/time”服务(在文件“local.gliim”中):

begin-handler /local/time
    get-param tzone
    get-time to curr_time timezone tzone
    set-param curr_time // set the return parameter to be obtained by the caller
end-handler

结果参数将在调用者中获取,然后从那里输出为 HTML(我们可以将其保存到文件中,或者其他方式),所以这里就是它现在在文件“some.gliim”中的内容:

begin-handler /some/service
    set-param tzone="EST" // set input parameter used by "/local/time"
    call-handler "/local/time"
    get-param curr_time // get parameter that was set by "/local/time"
    @
Current time is <>
end-handler

创建项目并运行:

gg -q --public
gg -r --req="/some/service" --silent-header --exec

最终结果相似。

从另一个调用请求,示例 #2

考虑这个处理程序,它检查数字是否为偶数,并返回真或假(文件“check.gliim”):

begin-handler /check/even
    get-param num type number // get input parameter
    if-true num every 2
        set-param is_even = true // set output parameter
    else-if
        set-param is_even = false // set output parameter
    end-if
end-handler

以下是从另一个处理程序调用它:

begin-handler /some/task
    set-param num = 23 // set input parameter for /check/even
    call-handler "/check/even"
    get-param is_even type bool //get output from /check/even
    if-true is_even equal true
        @EVEN
    else-if
        @ODD
    end-if
end-handler

创建项目并运行:

gg -q --public
gg -r --req="/some/task" --silent-header --exec

结果为(因为 23 是奇数):

ODD

结论

Gliimly 是一种语言和平台,旨在提供原生 Web 服务,其中的一切都围绕处理服务调用的概念。简单的高性能名称/值构造控制着网络上和本地处理程序之间的通信。可以说,Gliimly 不是一种经典的 C 类编程语言(尽管具有讽刺意味的是,它是用 C 语言构建的,并编译为 C 语言)。