我一直在尝试创建一个可以处理GET和POST方法的小型网络服务器。
由于某些原因,似乎POST参数无法解析,因为每当我打印整个请求字符串时,它们根本就不存在:
srv=net.createServer(net.TCP)
srv:listen(80,function(conn)
conn:on("receive", function(client,request)
local buf = ""
local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");
if(method == nil)then
_, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP");
end
local _GET = {}
if (vars ~= nil)then
for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do
_GET[k] = v
buf = buf , v
end
end
if method == "POST" then
buf = "POST DETECTED"
print("########")
print(request)
print("********")
end
client:send("HTTP/1.1 200 OK\n")
client:send("Server: NodeMCU 0.1\n")
client:send("Content-Length: " .. string.len(buf) .. "\n\n")
client:send(buf);
client:close();
collectgarbage();
end)
end)
对于简单的卷曲调用,如下例所示:
curl 10.0.130.12 -v -X POST -d "foo=bar"
我在NodeMCU方面看到的是:
#########
POST / HTTP/1.1
Host: 10.0.130.12
User-Agent: curl/7.45.0
Accept: */*
Content-Length: 7
Content-Type: application/x-www-form-urlencoded
*********
为什么我看不到POST参数?
答案 0 :(得分:1)
有些浏览器会在单个数据包(即Firefox)中发送HTTP标头和POST数据,有些浏览器将其分解(即Safari)。您需要继续读取数据,直到在标题结束后收到Content-Length指定的许多字节(即\ r \ n \ r \ n)。
正如MarcelStör所指出的,nodemcu-httpserver具有POST HTTP方法功能,因此您可以将其用作示例或直接使用该项目。
答案 1 :(得分:0)
我不确定为什么输出中没有打印参数,因为Content-Length: 7
清楚地表明内容是按预期发送的。如果您想要使用curl查看POST数据,则需要添加--trace-ascii -
,这将在输出中显示以下内容:
=> Send data, 7 bytes (0x7)
0000: foo=bar
要在脚本中处理它们,您需要处理请求的主体;以下代码可为您提供要处理的参数:local vars = string.match(request, "\r\n\r\n(.*)")
。