Web 如何在OpenWRT/uhttpd上阅读Lua的帖子

Web 如何在OpenWRT/uhttpd上阅读Lua的帖子,web,lua,openwrt,Web,Lua,Openwrt,我在OpenWRT的uhttpd上使用Lua,试图编写自己的门户来捕获定制嵌入式作业的表单数据 我不需要路由器和LUCI的东西来完成这项工作,尽管我已经浏览了现有的Lua脚本,但没有任何突破 我对uhttpd如何将POST数据放入Lua脚本感到困惑。这是怎么发生的?我在生成的Lua脚本中访问的POST和GET变量是什么 (在PHP中,这是$\u POST、$\u GET或php://input,ruby on rails是请求对象,python有cgi.FieldStorage()或reques

我在OpenWRT的uhttpd上使用Lua,试图编写自己的门户来捕获定制嵌入式作业的表单数据

我不需要路由器和LUCI的东西来完成这项工作,尽管我已经浏览了现有的Lua脚本,但没有任何突破

我对uhttpd如何将POST数据放入Lua脚本感到困惑。这是怎么发生的?我在生成的Lua脚本中访问的POST和GET变量是什么

(在PHP中,这是$\u POST、$\u GET或php://input,ruby on rails是请求对象,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>
浏览器输出:

Hello joe@somecompany.com

对这个过程的任何洞察都将是惊人的,谢谢

你可能确实想要露西,或者至少看看露西是怎么做的

POST数据位于请求正文中。Luci创建了一个和()


执行大部分工作的请求类。它将结果存储在请求的
params
字段中。然后,您可以使用熟悉的方法访问它们(您可以看到第一个调用调用我们前面看到的
\u parse\u input

您可能确实需要Luci,或者至少看看Luci是如何做到的

POST数据位于请求正文中。Luci创建了一个和()


执行大部分工作的请求类。它将结果存储在请求的
params
字段中。然后,您可以使用熟悉的方法访问它们(您可以看到第一个调用调用我们前面看到的
\u parse\u input

在其核心,HTTP头和POST内容分别进入Lua。HTTP头作为环境变量加载,POST内容在运行后通过交互式shell发送到Lua脚本中

因此,您可以使用OpenWRT上的
os.getenv()
nixio.getenv()
获取HTTP头,例如
HTTP\u USER\u AGENT

读取HTTP头并打印帖子内容的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
结果输出如下所示:

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脚本的文件扩展名匹配的内容类型。因此,
.json
将有一个
内容类型:application/json
头,
.html
文件将有一个
内容类型:text/html
头。

在其核心,HTTP头和POST内容分别进入Lua。HTTP头作为环境变量加载,POST内容在运行后通过交互式shell发送到Lua脚本中

因此,您可以使用OpenWRT上的
os.getenv()
nixio.getenv()
获取HTTP头,例如
HTTP\u USER\u AGENT

读取HTTP头并打印帖子内容的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
结果输出如下所示:

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脚本的文件扩展名匹配的内容类型。因此,
.json
将有一个
内容类型:application/json
头,
.html
文件将有一个
内容类型:text/html