Как получить параметры сообщения из http-запроса в lua, отправленного в NodeMCU

Я отправил этот HTTP-запрос POST через Tasker (приложение Android) на мой NodeMCU, который выглядит следующим образом:

POST / HTTP/1.1
Content-Type: application/x-www-form-urlencoded
User-Agent: Tasker/4.9u4m (Android/6.0.1)
Connection: close
Content-Length: 10
Host: 192.168.0.22
Accept-Encoding: gzip

<action>Play</action><SetVolume>5</SetVolume>

Я хочу извлечь только то, что находится между параметрамии. Как я могу это сделать?

2 ответа

Эта функция позволяет извлекать текст между двумя строковыми разделителями:

function get_text (str, init, term)
   local _, start = string.find(str, init)
   local stop = string.find(str, term)
   local result = nil
   if _ and stop then
      result = string.sub(str, start + 1, stop - 1)
   end
   return result
end

Пример взаимодействия:

> msg = "<action>Play</action><SetVolume>5</SetVolume>"
> get_text(msg, "<action>", "<SetVolume>")
Play</action>
> get_text(msg, "<action>", "</SetVolume>")
Play</action><SetVolume>5

Это модификация вышеуказанной функции, которая позволяет nil для любого из параметров init или же term, Если init является nilзатем текст извлекается до term разделитель. Если term является nilто текст извлекается из после init до конца строки.

function get_text (str, init, term)
   local _, start
   local stop = (term and string.find(str, term)) or 0
   local result = nil
   if init then
      _, start = string.find(str, init)
   else
      _, start = 1, 0
   end

   if _ and stop then
      result = string.sub(str, start + 1, stop - 1)
   end
   return result
end

Пример взаимодействия:

> msg = "<action>Play</action><SetVolume>5</SetVolume>"
> get_text(msg)
<action>Play</action><SetVolume>5</SetVolume>
> get_text(msg, nil, '<SetVolume>')
<action>Play</action>
> get_text(msg, '</action>')
<SetVolume>5</SetVolume>
> get_text(msg, '<action>', '<SetVolume>')
Play</action>

Для полноты картины, вот еще одно решение, которое я придумал:

string.gsub(request, "<(%a+)>([^<]+)</%a+>", function(key, val)
  print(key .. ": " .. val)
end)

Рабочий пример использования данного HTTP-запроса в вашем вопросе можно увидеть здесь:

https://repl.it/repls/GlamorousAnnualConferences

Другие вопросы по тегам