Erlang Server Interface的工作示例

时间:2010-11-27 13:59:27

标签: erlang cgi inets

我正在尝试让Erlang的Inets mode_esi工作并运行一些功能。所以,到目前为止,我没有成功。有人可以发布一个如何运行Inets的最小示例,以便像http:localhost:8099/esi/my_mod:foo这样的网址会调用方法my_mod:foo/3吗?

另外:我已经使用这些命令启动了inets:

inets:start(),
inets:start(httpd, [{port, 8099}, {server_name, "localhost"}, {document_root, "."}, 
  {server_root, "."}, {erl_script_alias, {"/esi", [my_esi, io]}}]).

该模块是:

-module(my_esi).
-export([foo/3]).
foo(Sid, Env, In) -> mod_esi:deliver(Sid, ["bla"]).

但浏览到http://localhost:8099/esi/my_esi:foo会导致错误消息。

3 个答案:

答案 0 :(得分:1)

我自己解决了。出于某种原因,超出我的理解,当我使用配置文件(inets/examples/server_root/conf/8080.conf的修改版本)调用Inets时,完全相同的代码工作。我想这个示例文件包含了一个比我在inets:start(httpd, [...])中列出的更完整的Inets属性列表。如果将来有人遇到Inets问题,我的建议是从示例配置开始。

答案 1 :(得分:1)

为了澄清已经说过的话,我将给出一个有效的例子(从头开始)。这是为了帮助那些从谷歌来到这里的人,主要是因为这是我发现它的方式;)

首先,创建模块:

# filename: my_esi.erl
-module(my_esi).
-export([foo/3,bar/3]).
foo(Sid, Env, In) -> mod_esi:deliver(Sid, ["foo"]).
bar(Sid, Env, In) -> mod_esi:deliver(Sid, ["bar"]).

保存,然后编译:

erlc my_esi.erl

你现在有my_esi.beam

然后从bash运行shell

erl

在shell中键入以下内容:

inets:start().
{Httpd_State,Httpd_Pid} = inets:start(httpd, [{port, 8099}, {server_name, "localhost"}, {document_root, "."}, {modules,[mod_esi]},{server_root, "."}, {erl_script_alias, {"/esi", [my_esi, io]}}]).

这里的重要部分是:

{modules,[mod_esi]}

如果您需要其他模块,请将它们附加到列表中加载它们。

澄清如何/为何:

我首先承认起初看起来确实有些奇怪,而且文档的帮助不如我所希望的那样。但是,我意识到:

modules()       -> [atom()]

变为:

{modules, [mod_access, mod_esi, ..., etc.]}

希望它可以帮助某人:)

答案 2 :(得分:0)

好的,这里是:

  1. {erl_script_alias, {"/esi", [my_mod]}}网络服务器设置inets,以便接受该模块。
  2. 撰写my_mod。类似的东西:

    -module(my_mod).
    -export([foo/3]).
    
    
    foo(SessID, _Env, _Input) ->
      mod_esi:deliver(SessID, ["Data ", <<"as">>, " an iolist"]).
    
  3. 确保mod_esi属于名为inets
  4. {modules, [.., mod_esi, ..}}部分
  5. 这一步非常重要:呼吸3次,背诵神圣的话语“我向你祈祷,这是你将要工作的”。交叉你的手指。
  6. 喝一杯咖啡。茶不行。它必须是咖啡。
  7. 享受您的网络服务器。