使用nodemcu没有可用的POST参数

我一直在尝试创建一个能够处理GET和POST方法的小型Web服务器。

由于某种原因,似乎无法解析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调用:

 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参数?

点赞
用户1442917
用户1442917

我不确定为什么参数没有在输出中打印出来,因为 Content-Length: 7 明确表示内容已按预期发送。如果您想使用 curl 查看 POST 数据,需要添加 --trace-ascii -,这将在输出中显示类似以下内容:

=> 发送数据,7 字节 (0x7)
0000: foo=bar

要在脚本中处理它们,您需要处理请求主体;以下代码可能会给您要处理的参数:local vars = string.match(request, "\r\n\r\n(.*)")

2016-02-14 05:41:28
用户316875
用户316875

将POST数据读入的正确方式

一些浏览器会将HTTP头和POST数据封装在一个数据包中(例如Firefox),而另一些则会分开发送(例如Safari)。因此,你需要一直读取数据,直到你收到头部之后Content-Length指定的字节数(也就是\r\n\r\n)。

正如Marcel Stör所指出的那样,nodemcu-httpserver具有可用的POST方法,所以你可以将其作为示例或直接使用该项目。

2016-02-17 03:14:52