Рабочий пример для интерфейса сервера Erlang - PullRequest
3 голосов
/ 27 ноября 2010

Я пытаюсь заставить Inlan mode_esi Эрланга работать и запустить какую-то функцию.Так что пока мне это не удалось.Может кто-нибудь опубликовать минимальный пример того, как запустить Inets так, чтобы URL типа 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 ]

1 голос
/ 28 ноября 2010

Я решил это сам.По некоторым причинам, вне моего понимания, точно такой же код работал, когда я вызывал Inets с файлом конфигурации (модифицированная версия inets/examples/server_root/conf/8080.conf).Я полагаю, что файл примера содержит более полный список свойств, которые требуются Inets, чем то, что я перечислил в inets:start(httpd, [...]).Если в будущем кто-нибудь столкнется с проблемой Inets, я советую начать с примера конфигурации.

1 голос
/ 20 января 2011

Чтобы уточнить, что уже было сказано, я приведу рабочий пример (с нуля). Это для того, чтобы помочь тем, кто пришел сюда из гугла, в основном потому, что так я его нашел;)

Сначала создайте модуль:

# 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.]}

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

0 голосов
/ 27 ноября 2010

Хорошо, вот так:

  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. Наслаждайтесь своим веб-сервером.
...