2016-02-13 43 views
1

我一直在試圖創建一個可以處理GET和POST方法的小型web服務器。使用nodemcu的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

如果你這樣做是因爲你想了解NodeMCU和/或Lua,那麼對你很有幫助。如果沒有,我建議你嘗試https://github.com/marcoskirsch/nodemcu-httpserver。 –

+0

我在nodemcu-build.com的1.5.1 dev分支上得到了預期的輸出結果。也許你可以試試這個構建,看看你是否繼續有問題? '######## POST/HTTP/1.1 主機:192.168.1.100 用戶代理:捲曲/ 7.43.0 接受:*/* 的Content-Length:7 內容類型:應用/ x-www-form-urlencoded foo = bar ********' –

回答

0

我不確定爲什麼參數不會打印在輸出中,因爲Content-Length: 7清楚地表明內容按預期發送。如果你想看到的捲曲的POST數據,你需要添加--trace-ascii -,它會顯示你喜歡的東西在下面的輸出:

=> Send data, 7 bytes (0x7) 
0000: foo=bar 

爲了處理這些腳本,你需要處理請求的主體;以下代碼可能會給你參數處理:local vars = string.match(request, "\r\n\r\n(.*)")

1

某些瀏覽器會將HTTP標頭和POST數據發送到單個數據包(即Firefox)中,並且有些瀏覽器會將其分解(即Safari)。您需要繼續閱讀數據,直到您收到標題結束後正好由Content-Length指定的很多字節(即\ r \ n \ r \ n)。

正如MarcelStör指出的那樣,nodemcu-httpserver具有POST HTTP方法的功能,因此您可以將其用作示例或直接直接使用該項目。