This directory contains five example Erlang XML-RPC servers. Four of them are desribed in this README file. The fifth server is an example of robust banking system and is described in a separate tutorial (robust_banking.txt). The servers are small and silly but together they utilize a majority of the functionality provided by the library. The first example (fib_server.erl) calculates Fibonacci values and is a non-keepalive server. The second example (echo_server.erl) echoes back any incoming parameters and is a non-keepalive server. The third example (date_server.erl) calculates calendar values for given dates and is a keepalive server which uses the state variable to provide login state and different timeout settings. The fourth example (validator.erl) is a validation server which can be used to validate the library using the http://validator.xmlrpc.org/ service. Run make to compile the servers. You need to replace "../../xmerl/ebin" below to point at your installation of the xmerl package. If you intend to verify inter-operability with the example Java clients you need to replace "../../apache/xmlrpc/bin/xmlrpc-1.1.jar" below to point at your installation of the Apache XML-RPC library. Get it at http://www.apache.org/. You furthermore need a recent installation of Java/JDK. Get it at http://java.sun.com/. Run 'make java_clients' to compile the Java clients. Example 1: fib_server.erl ------------------------- $ erl -pa ../ebin -pa ../../xmerl/ebin Erlang (BEAM) emulator version 5.1.2.b2 [source] Eshell V5.1.2.b2 (abort with ^G) 1> {ok, Pid} = xmlrpc:start_link({fib_server, handler}). {ok,<0.30.0>} 2> xmlrpc:call({127, 0, 0, 1}, 4567, "/", {call, foo, []}). {ok,{response,{fault,-1,"Unknown call: {call,foo,[]}"}}} 3> xmlrpc:call({127, 0, 0, 1}, 4567, "/", {call, fib, [0]}). {ok,{response,[1]}} 4> xmlrpc:call({127, 0, 0, 1}, 4567, "/", {call, fib, [4]}). {ok,{response,[5]}} Nothing fancy. Uses a new HTTP connection for each call and handles unknown method calls gracefully. FibClient.java could as well has been used to call the Fibonacci server: $ java -classpath ../../apache/xmlrpc/bin/xmlrpc-1.1.jar:. FibClient 0 1 $ java -classpath ../../apache/xmlrpc/bin/xmlrpc-1.1.jar:. FibClient 4 5 Stop the Fibonacci server: 5> xmlrpc:stop(Pid). stop Example 2: echo_server.erl -------------------------- $ erl -pa ../ebin -pa ../../xmerl/ebin Erlang (BEAM) emulator version 5.1.2.b2 [source] Eshell V5.1.2.b2 (abort with ^G) 1> {ok, Pid} = xmlrpc:start_link({echo_server, handler}). {ok,<0.30.0>} 2> xmlrpc:call({127, 0, 0, 1}, 4567, "/", {call, foo, []}). {ok,{response,{fault,-1,"Unknown call: {call,foo,[]}"}}} 3> xmlrpc:call({127, 0, 0, 1}, 4567, "/", {call, echo, [42.0]}). {ok,{response,[{array, [42.0000]}]}} 4> xmlrpc:call({127, 0, 0, 1}, 4567, "/", {call, echo, [2.6, {array, [5, "foo"]}, {struct, [{baz, 1}, {bar, {base64, "SDOMCVN=-kmDC*="}}]}]}). {ok,{response,[{array,[2.60000, {array,[5,"foo"]}, {struct,[{baz,1},{bar,{base64,"SDOMCVN=-kmDC*="}}]}]}]}} The parameters are converted from Erlang to XML format before being sent to the server. When the parameters arrive at the server they are converted back to Erlang format. The server handler echoes the parameters back as a response to the client, i.e. in the process converting the parameters back to XML format. The response arrives at the client which finally convert the parameters back to Erlang format. Nothing fancy. Uses a new HTTP connection for each call and handles unknown method calls gracefully. EchoClient.java could as well has been used to call the echo server: $ java -classpath ../../apache/xmlrpc/bin/xmlrpc-1.1.jar:. EchoClient [42.5, foo, 7] Stop the echo server: 5> xmlrpc:stop(Pid). stop Example 3: date_server.erl -------------------------- $ erl -pa ../ebin -pa ../../xmerl/ebin Erlang (BEAM) emulator version 5.1.2.b2 [source] Eshell V5.1.2.b2 (abort with ^G) 1> xmlrpc:start_link(4567, 1000, 300000, {date_server, handler}, {false, 0}). {ok,<0.30.0>} 2> xmlrpc:call({127, 0, 0, 1}, 4567, "/", {call, calc, [{struct, [{is_leap_year, 1492}]}]}, true, 300000). {ok,#Port<0.32>,{response,{fault,-3,"Not authenticated"}}} 3> xmlrpc:call({127, 0, 0, 1}, 4567, "/", {call, login, ["Foo", "Bar"]}, true, 300000). {ok,#Port<0.40>,{response,{fault,-1,"Invalid authentication"}}} 4> {ok, S, _} = xmlrpc:call({127, 0, 0, 1}, 4567, "/", {call, login, ["Slarti", "Bartfast"]}, true, 300000). {ok,#Port<0.42>,{response,["ok"]}} 5> xmlrpc:call(S, "/", {call, login, ["Slarti", "Bartfast"]}, true, 300000). {ok,#Port<0.42>,{response,{fault,-2,"Already authenticated"}}} 6> xmlrpc:call(S, "/", {call, foo, []}, true, 300000). {ok,#Port<0.42>,{response,{fault,-4,"Unknown call: {call,foo,[]}"}}} 7> xmlrpc:call(S, "/", {call, calc, [{struct, [{is_leap_year, 1492}]}]}, true, 300000). {ok,#Port<0.42>,{response,[{array,[3,{struct,[{is_leap_year,true}]}]}]}} 8> xmlrpc:call(S, "/", {call, calc, [{struct, [{is_leap_year, 2010}]}]}, true, 300000). {ok,#Port<0.42>,{response,[{array,[4,{struct,[{is_leap_year,false}]}]}]}} 9> xmlrpc:call(S, "/", {call, calc, [{struct, [{is_leap_year, 2010}, {days_since, {struct, [{y, 2002}, {m, 12}, {d, 10}]}}]}]}, true, 300000). {ok,#Port<0.42>, {response,[{array,[5,{struct,[{is_leap_year,false},{days_since,731559}]}]}]}} 10> xmlrpc:call(S, "/", {call, logout, []}). {ok,{response,["ok"]}} 11> xmlrpc:call(S, "/", {call, calc, [{struct, [{is_leap_year, 2010}]}]}, true, 300000). {error,#Port<0.42>,closed} DateClient.java could as well has been used to call the date server: $ java -classpath ../../apache/xmlrpc/bin/xmlrpc-1.1.jar:. DateClient ok [1, {days_since=731204}] [2, {days_since=731204, day_of_week=Thursday, is_leap_year=true}] ok Stop the date server: 12> xmlrpc:stop(Pid). stop Example 4: validator.erl -------------------------- $ erl -pa ../ebin -pa ../../xmerl/ebin Erlang (BEAM) emulator version 5.1.2.b2 [source] Eshell V5.1.2.b2 (abort with ^G) 1> {ok, Pid} = xmlrpc:start_link({validator, handler}). {ok,<0.30.0>} If your computer is connected to the Internet you can now verify that the library is compliant with the validation service at http://validator.xmlrpc.org/. Stop the validator server: 2> xmlrpc:stop(Pid). stop