我在OpenWRT上使用Lua on uhttpd,试图编写自己的门户来捕获自定义嵌入式作业的表单数据。
我不需要路由器和LUCI这项工作,虽然我已经通过现有的Lua脚本没有任何突破。
我对uhttpd如何将POST数据放入Lua脚本感到困惑。这是怎么发生的?我在生成的Lua脚本中访问的POST和GET变量是什么?
(在PHP中,这是$ _POST,$ _GET或php://输入,rails上的ruby是请求对象,python有cgi.FieldStorage()或request.POST ......它在Lua上是什么/ uhttpd?)
这是一个简单的示例脚本。
前端/index.html:
<!DOCTYPE html>
<html>
<body>
<form action="/cgi/luascripts/processform.lua" method="post">
<input type="email" name="email" placeholder="email@example.com" />
<input type="submit" value="submit" />
</form>
</body>
</html>
后端/cgi-bin/luascripts/processform.lua:
-- some magic happens to bring POST data into email variable (how does this happen?)
-- email = 'joe@somecompany.com'
output = [[
Hello {email}
]]
output = output:gsub("{email}", email)
print(output)
浏览器输出:
Hello joe@somecompany.com
对这个过程的任何见解都会很棒,谢谢!
答案 0 :(得分:2)
你可能确实想要Luci,或者至少看看Luci是如何做到的。
POST数据位于请求正文中。 Luci创建了ltn12 compatible source to read it和passes it to the http.Request constructor(same with CGI)。
请求类calls protocol.parse_message_body执行大部分工作。它将结果存储在请求的params
字段中。然后,您可以使用熟悉的formvalue方法(source)访问它们 - 您可以看到我们之前看到的第一个来电呼叫_parse_input
。
答案 1 :(得分:2)
在其核心,HTTP标头和POST内容分别进入Lua。 HTTP标头作为环境变量加载,POST内容在运行后就像交互式shell一样发送到Lua脚本中。
因此,您可以在OpenWRT上使用HTTP_USER_AGENT
或os.getenv()
获取nixio.getenv()
等HTTP标头。
读取HTTP标头并打印POST内容的Lua CGI脚本如下所示:
require "nixio"
-- prepare the browser for content:
print("\r")
-- print http headers
http_headers = nixio.getenv()
for k,v in pairs(http_headers) do
print(k, v)
end
-- print POST output
print(io.read("*all"))
结果输出如下所示:
HTTP_ACCEPT text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
SCRIPT_NAME /cgi-bin/test.htm
QUERY_STRING parm1=val&parm2=val2
HTTP_ACCEPT_ENCODING gzip, deflate
SERVER_ADDR 192.168.1.1
GATEWAY_INTERFACE CGI/1.1
HTTP_AUTHORIZATION
CONTENT_LENGTH 23
SERVER_PORT 80
SCRIPT_FILENAME /www/cgi-bin/test.htm
REQUEST_URI /cgi-bin/test.htm?parm1=val&parm2=val2
...
DOCUMENT_ROOT /www
CONTENT_TYPE application/x-www-form-urlencoded
HTTP_CONNECTION keep-alive
HTTP_USER_AGENT Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36
HTTP_ACCEPT_LANGUAGE en-us
REQUEST_METHOD POST
test=value&test1=value1
值得注意的是,uhttpd将代表CGI脚本将HTTP标头输出到浏览器,包括与CGI脚本的文件扩展名匹配的Content-Type。因此,.json
将有Content-Type: application/json
标头,.html
文件将有Content-Type: text/html
标头。