Рабочий пример для Erlang Server Interface
Я пытаюсь заставить Inlan mode_esi Эрланга работать и запустить какую-то функцию. Так что пока мне это не удалось. Может кто-нибудь опубликовать минимальный пример того, как запустить Inets, чтобы URL, как http:localhost:8099/esi/my_mod:foo
вызовет метод my_mod:foo/3
?
Дополнение: я начал инет с этими командами:
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 ответа
Я решил это сам. По какой-то причине, вне моего понимания, точно такой же код работал, когда я вызывал Inets с файлом конфигурации (модифицированная версия inets/examples/server_root/conf/8080.conf
). Я предполагаю, что файл примера включает в себя более полный список свойств, которые требуются Inets, чем то, что я перечислил в inets:start(httpd, [...])
, Если в будущем кто-нибудь столкнется с проблемой Inets, я советую начать с примера конфигурации.
Чтобы уточнить, что уже было сказано, приведу рабочий пример (с нуля). Это для того, чтобы помочь тем, кто пришел сюда из гугла, в основном потому, что так я его нашел;)
Сначала создайте модуль:
# 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
erl
Внутри оболочки введите следующее:
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.]}
Надеюсь, это поможет кому-то:)
Хорошо, здесь идет:
- задавать
{erl_script_alias, {"/esi", [my_mod]}}
дляinets
веб-сервер, поэтому модуль принят. Написать
my_mod
, Что-то вроде:-module(my_mod). -export([foo/3]). foo(SessID, _Env, _Input) -> mod_esi:deliver(SessID, ["Data ", <<"as">>, " an iolist"]).
- Удостовериться
mod_esi
это частьinets
раздел называется модуль:{modules, [.., mod_esi, ..}}
- Этот шаг очень важен: вдохните 3 раза, прочитайте святые слова: "Я молю тебя, Инетс, чтобы ты работал на этот раз". Скрестить пальцы.
- Выпей чашку кофе. Чай не подойдет. Это должен быть кофе.
- Наслаждайтесь вашим веб-сервером.