Examples
Client example
Below is a small sample code displaying the use of the library in a client application.
require "xmlrpc.http" local ok, res = xmlrpc.http.call ( "http://www.oreillynet.com/meerkat/xml-rpc/server.php", "system.listMethods") print (ok) for i, v in pairs(res) do print ('\t', i, v) end
Type conversion example
The next example shows how to force the conversion of types from Lua to XML-RPC.
require "xmlrpc" double_array_type = xmlrpc.newArray ("double") double_array = xmlrpc.newTypedValue ( { 1.1, 2, 3, 4 }, double_array_type) double_array_array_type = xmlrpc.newArray (double_array_type) double_array_array = xmlrpc.newTypedValue ( { { 11, 12, 13, }, { 21, 22, 23, }, { 31, 32, 33, }, }, double_array_array_type)
The table double_array_array
will be:
<array> <data> <value> <array> <data> <value><double>11</double></value> <value><double>12</double></value> <value><double>13</double></value> </data> </array> </value> <value> <array> <data> <value><double>21</double></value> <value><double>22</double></value> <value><double>23</double></value> </data> </array> </value> <value> <array> <data> <value><double>31</double></value> <value><double>32</double></value> <value><double>33</double></value> </data> </array> </value> </data> </array>
Server example
Follows a small example of a server based on Xavante
WSAPI. You can call the service for example with
the xmlrpc
tool
from XML-RPC
C (xmlrpc http://localhost:12345
hello_world
) or by
using examples/client.lua
in the source
tarball.
require("xavante") require("xavante.httpd") require("wsapi.xavante") require("wsapi.request") require("xmlrpc") --- XML-RPC WSAPI handler -- @param wsapi_env WSAPI environment function wsapi_handler(wsapi_env) local headers = { ["Content-type"] = "text/xml" } local req = wsapi.request.new(wsapi_env) local method, arg_table = xmlrpc.srvDecode(req.POST.post_data) local func = xmlrpc.dispatch(method) local result = { pcall(func, unpack(arg_table or {})) } local ok = result[1] if not ok then result = { code = 3, message = result[2] } else table.remove(result, 1) if table.getn(result) == 1 then result = result[1] end end local r = xmlrpc.srvEncode(result, not ok) headers["Content-length"] = tostring(#r) local function xmlrpc_reply(wsapienv) coroutine.yield(r) end return 200, headers, coroutine.wrap(xmlrpc_reply) end -- XML-RPC exported functions xmlrpc_exports = {} --- Get simple string. -- @return simple string function xmlrpc_exports.hello_world() return "Hello World" end local rules = {{ match = ".", with = wsapi.xavante.makeHandler(wsapi_handler) }} local config = { server = {host = "*", port = 12345}, defaultHost = { rules = rules} } xmlrpc.srvMethods(xmlrpc_exports) xavante.HTTP(config) xavante.run()
Note that the package post
and the function
respond
should be provided by the cgi launcher.