Рабочий пример для 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.]}

Надеюсь, это поможет кому-то:)

Хорошо, здесь идет:

  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 раздел называется модуль: {modules, [.., mod_esi, ..}}
  4. Этот шаг очень важен: вдохните 3 раза, прочитайте святые слова: "Я молю тебя, Инетс, чтобы ты работал на этот раз". Скрестить пальцы.
  5. Выпей чашку кофе. Чай не подойдет. Это должен быть кофе.
  6. Наслаждайтесь вашим веб-сервером.
Другие вопросы по тегам