Objectif
J’ai présenté dans un précédant billet comment mettre en œuvre un serveur web WSAPI-Xavante. L’objectif de ce billet est de présenter plus en détail la mise en œuvre d’une fonction permettant de répondre à une requête de type GET ou POST sans utiliser la librairie WSAPI.
Site web du tutoriel
---------------------------------------------------------------- -- Exemple de mise en oeuvre de WSAPI et Xavante (tuto02.lua) -- ---------------------------------------------------------------- local xavante = require("xavante") -- Formatage sous forme de chaîne de caractères du contenu d'une variable local function tostr(variable, indent) local str = "" indent = indent or "" local incindent = " " if (type(variable) ~= "table") then if (type(variable) == "string") then str = string.format("%q", variable) else str = tostring(variable) end else local separateur = "" for i, v in pairs(variable) do str = str .. separateur separateur = ", \n" if(type(i) == "number") then str = str .. indent .. incindent .. tostr(v, indent .. incindent) else str = str .. indent .. incindent .. tostr(i, indent .. incindent) .. " = " .. tostr(v, indent .. incindent) end end str = "{\n" .. str .. "\n" .. indent .. "}" end return str end -- La fonction permettant de répondre à des requêtes GET ou POST function fonctionSimple(req, res) local post = nil res.headers["Content-type"] = "text" if (req["headers"]["content-length"]) then post = req.socket:receive( tonumber(req["headers"]["content-length"]) ) end res.content = string.format('\nreq = \n%s\nreq["cmd_mth"] = %s\nreq["parsed_url"]["path"] = "%s"\nreq["parsed_url"]["query"] = "%s"\npost = %s\n\n', tostring(tostr(req)), tostring(req["cmd_mth"]), tostring(req["parsed_url"]["path"]), tostring(req["parsed_url"]["query"]), tostring(post)) return res end local mesRegles = { { -- Gestionnaire de fonction (http://localhost:8080/fsimple) match = { "/fsimple$", "/fsimple/" }, with = fonctionSimple }, } -- Message de départ xavante.start_message( function(ports) local date = os.date("[%Y-%m-%d %H:%M:%S]") print(string.format("%s Xavante started on port(s) %s", date, table.concat(ports, ", "))) end ) -- Configuration xavante.HTTP{ server = { host = "*", port = 8080 }, defaultHost = { rules = mesRegles }, } -- Démarrage (Dans un terminal : wsapi -c tuto02.lua -p 8080) xavante.start() -- Test de requête GET : curl "http://localhost:8080/fsimple/sec1/sec2?name1=value1&name2=value2" -- Test de requête POST : ccurl --data "Données en POST" "http://localhost:8080/fsimple/sec1/sec2?name1=value1&name2=value2" |
Le résultat
Bien entendu, la première étape consiste à lancer le serveur web : wsapi -c tuto02.lua -p 8080
Dans le code ci-dessus, la fonction fonctionSimple(req, res)
traite les informations des requêtes GET ou POST.
On peut tester une requête GET sur cette fonction en saisissant dans un terminal la commande suivante :
curl "http://localhost:8080/fsimple/sec1/sec2?name1=value1&name2=value2" |
req = { "serversoftware" = "Xavante 2.2.0", "socket" = { "socket" = tcp{client}: 0x14864b8 }, "relpath" = "/fsimple/sec1/sec2", "parsed_url" = { "host" = "localhost", "path" = "/fsimple/sec1/sec2", "query" = "name1=value1&name2=value2", "scheme" = "http", "port" = "8080", "authority" = "localhost:8080" }, "srv" = "127.0.0.1", "cmdline" = "GET /fsimple/sec1/sec2?name1=value1&name2=value2 HTTP/1.1", "handler" = function: 0x143e590, "copasskt" = { "socket" = tcp{client}: 0x14864b8 }, "rawskt" = tcp{client}: 0x14864b8, "built_url" = "http://localhost:8080/fsimple/sec1/sec2?name1=value1&name2=value2", "cmd_version" = "HTTP/1.1", "cmd_mth" = "GET", "cmd_url" = "/fsimple/sec1/sec2?name1=value1&name2=value2", "port" = "8080", "headers" = { "host" = "localhost:8080", "user-agent" = "curl/7.35.0", "accept" = "*/*" } } req["cmd_mth"] = GET req["parsed_url"]["path"] = "/fsimple/sec1/sec2" req["parsed_url"]["query"] = "name1=value1&name2=value2" post = nil |
On peut tester une requête POST sur cette fonction en saisissant dans un terminal la commande suivante :
ccurl --data "Données en POST" "http://localhost:8080/fsimple/sec1/sec2?name1=value1&name2=value2" |
req = { "serversoftware" = "Xavante 2.2.0", "socket" = { "socket" = tcp{client}: 0x147d868 }, "relpath" = "/fsimple/sec1/sec2", "parsed_url" = { "host" = "localhost", "path" = "/fsimple/sec1/sec2", "query" = "name1=value1&name2=value2", "scheme" = "http", "port" = "8080", "authority" = "localhost:8080" }, "srv" = "127.0.0.1", "cmdline" = "POST /fsimple/sec1/sec2?name1=value1&name2=value2 HTTP/1.1", "handler" = function: 0x143e590, "copasskt" = { "socket" = tcp{client}: 0x147d868 }, "rawskt" = tcp{client}: 0x147d868, "built_url" = "http://localhost:8080/fsimple/sec1/sec2?name1=value1&name2=value2", "cmd_version" = "HTTP/1.1", "cmd_mth" = "POST", "cmd_url" = "/fsimple/sec1/sec2?name1=value1&name2=value2", "port" = "8080", "headers" = { "host" = "localhost:8080", "content-type" = "application/x-www-form-urlencoded", "accept" = "*/*", "user-agent" = "curl/7.35.0", "content-length" = "15" } } req["cmd_mth"] = POST req["parsed_url"]["path"] = "/fsimple/sec1/sec2" req["parsed_url"]["query"] = "name1=value1&name2=value2" post = Données en POST |
Références
GitHub : keplerproject/xavante
Billet sur ce blog : WSAPI et Xavante : serveur Web Lua
Sommaire Domotique sur ce blog