Я пишу простой веб-сервер HTTP на своем Arduino Uno Wifi Rev2. для обработки входящего запроса HTTP POST в формате JSON.
Вот как я отправляю HTTP-запрос (с JSON) от моего клиента:
curl \
--request POST \
--header "Content-Type: application/json" \
--data '{
"A": "B",
"C": "D"
}' \
"http://192.168.4.1/myEndpoint"
Это строка, которую получает веб-сервер Arduino:
POST /myEndpoint HTTP/1.1\r\nHost: 192.168.4.1\r\nUser-Agent: curl/7.54.0\r\nAccept: */*\r\nContent-Type: application/json\r\nContent-Length: 34\r\n\r\n{\n "A": "B",\n "C": "D" \n}
Я использую библиотеку Arduino Regexp Ника Гэммона, чтобы анализировать этот запрос, проверять его и извлекать данные JSON.
Это работает, но синтаксический анализ HTTP-запроса таким образом чрезвычайно хрупок и кажется хакерским. Это может легко сломаться, если другой клиент переупорядочивает/опускает заголовок или пропускает символы возврата каретки. Это ужасное регулярное выражение, которое я использую для проверки:
httpRegexp = "POST /myEndpoint HTTP/[%d%.]+%\r%\nHost: 192%.168%.4%.1%\r%\nUser%-Agent: curl/[%d%.]+%\r%\nAccept: %*/%*%\r%\nContent%-Type: application/json%\r%\nContent%-Length: %d+%\r%\n%\r%\n{%s*\"[A-Za-z]+\"%s*:%s*\".+\"%s*,%s*\"[A-Za-z]+\"%s*:%s*\".+\"%s*}";
Есть ли лучший/рекомендуемый способ проверки и анализа HTTP-запроса? Это должна быть проблема, с которой другие уже столкнулись и решили. Пожалуйста, опубликуйте фрагмент кода, решающий эту проблему, если это возможно.