2016-02-13 4 views
1

Я пытался создать крошечный веб-сервер, который может обрабатывать методы GET и POST.Параметры POST недоступны с помощью nodemcu

почему-то кажется, что параметры 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

Я получаю ожидаемый вывод, запускающий ваш код на ветке 1.5.1 dev от nodemcu-build.com. Может быть, вы можете попробовать эту сборку и посмотреть, не возникли ли у вас проблемы? '######## POST/HTTP/1.1 хоста: 192.168.1.100 User-Agent: завиток/7.43.0 Accept: */* Content-Length: 7 Content-Type: приложения/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).

Как указал Марсель Штор, у nodemcu-httpserver есть метод POST HTTP, поэтому вы можете использовать его в качестве примера или непосредственно использовать проект напрямую.