2010-11-27 4 views
3

Ich versuche Erlangs Inets mode_esi arbeiten und einige Funktionen ausführen. So weit, es ist mir nicht gelungen. Kann jemand ein minimales Beispiel für das Ausführen von Inets posten, sodass eine URL wie http:localhost:8099/esi/my_mod:foo die Methode my_mod:foo/3 aufruft?Arbeitsbeispiel für Erlang Server Interface

Ergänzung: Ich habe inets mit diesen Befehlen gestartet:

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

Das Modul ist:

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

Aber gerade zu http://localhost:8099/esi/my_esi:foo Ergebnis in einer Fehlermeldung.

Antwort

1

Ich habe es selbst gelöst. Aus irgendeinem Grund, über mein Verständnis hinaus, funktionierte der exakt gleiche Code, als ich Inets mit einer Konfigurationsdatei (einer modifizierten Version von inets/examples/server_root/conf/8080.conf) aufgerufen habe. Ich nehme an, dass die Beispieldatei eine vollständigere Liste der Eigenschaften enthält, die Inets benötigt, als die, die ich in inets:start(httpd, [...]) aufgeführt habe. Sollte jemand in Zukunft auf Inets stoßen, rate ich Ihnen, mit der Beispielkonfiguration zu beginnen.

0

Ok, hier geht:

  1. gesetzt {erl_script_alias, {"/esi", [my_mod]}} für den inets Web-Server, so dass das Modul akzeptiert wird.
  2. Schreiben Sie my_mod. Etwas wie:

    -module(my_mod). 
    -export([foo/3]). 
    
    
    foo(SessID, _Env, _Input) -> 
        mod_esi:deliver(SessID, ["Data ", <<"as">>, " an iolist"]). 
    
  3. Stellen Sie sicher, mod_esi ist Teil inets Abschnitt namens Modul: {modules, [.., mod_esi, ..}}
  4. Dieser Schritt ist sehr wichtig: 3 mal atmen, rezitieren die heiligen Worte „ich dir beten, inets, dass Sie arbeite diesmal ". Drück die Daumen.
  5. Trinken Sie eine Tasse Kaffee. Tee wird nicht tun. Es muss Kaffee sein.
  6. Genießen Sie Ihren Webserver.
+0

ich die Frage mit dem nicht-funktionierendes Beispiel aktualisiert. Was mache ich da falsch? Scheint wie eine einfache Version von dem, was Sie geschrieben haben. –

1

Um zu klären, was bereits gesagt wurde, gebe ich ein funktionierendes Beispiel (von Grund auf). Dies ist diejenigen, die kamen hier von Google zu helfen, vor allem, weil es ist, wie ich es gefunden;)

Erstellen Sie zunächst das Modul:

# 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"]). 

speichern, dann kompilieren:

erlc my_esi.erl 

Sie werden jetzt my_esi.beam

haben dann die Shell bash laufen

erl 

Innerhalb der Schale geben Sie den folgenden:

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

Der wichtige Teil ist hier:

{modules,[mod_esi]} 

Wenn Sie andere Module benötigen, laden Sie sie, indem Sie sie in die Liste angehängt wird.

Um zu klären, wie/warum:

Ich werde zunächst zugeben, dass es tut, scheint ein wenig auf den ersten seltsam, und dass die Dokumentation war weniger nützlich, als ich gehofft hatte. Allerdings habe ich festgestellt, dass:

modules()  -> [atom()] 

wird:

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

Hoffe, dass es jemand hilft :)