• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Получение запроса GET

demon13022012

New member
Имеется обработка запроса:
HTTP.on("/relay_switch", [](){
return('123');
});
вместо /relay_switch мы указываем запрос на который нужно что-то сделать.

Но у меня вопрос: если я не знаю какой будет запрос, то как сделать поиск по саму запросу, то есть есть ли в этом запросе какой-то текст.

Например передается запрос/num_10 или /num_11 и так далее...
Я же не буду дублировать каждый запрос изменяя одну лишь цифру, нужно какой-то универсальный алгоритм который будет проверять как-то в цикле HTTP.on.indexOf('num_'+i). Или как мне получить сам запрос в виде текста чобы я его просплитил?
 

yurik72

Member
Как раз для таких случаев придумали POST и GET
Два решения
1. Наверное надо все таки выбрать какой-то базовый path ..../num , а 10 или 11 передавать через get строку и соответственно принимать решение на сервере разбирая параметры . Например ..../num?value=10

2. Использовать библиотеку типа https://github.com/me-no-dev/ESPAsyncWebServer. Там много вариантов от написания собственных patterns через регулярные выражения. так и для простого обработки notfound. Т.е. все заранее незнакомые пути будут приходить в обработчик notfound.

Из плюсов второго варианта. псевдо асинхронность на esp8266. Т.е. сервер способен принимать след. запрос, пока первый еще не закончился. Чего нет в базовом...
 

enjoynering

Well-known member
Шас пишу сервер на стоковой библиотеке из Arduino. Так вот, на сервере есть html страницы которые вызывают 3-4 дополнительных файлов (картинки, is, json и тд) с этого же сервера. Ничего при этом не тормозит. Не могу понять в чем преимущество ESPAsyncWebServer?
 

CodeNameHawk

Moderator
Команда форума
Помогает, когда надо ту же страницу одновременно на нескольких устройствах открывать.
 

yurik72

Member
Шас пишу сервер на стоковой библиотеке из Arduino. Так вот, на сервере есть html страницы которые вызывают 3-4 дополнительных файлов (картинки, is, json и тд) с этого же сервера. Ничего при этом не тормозит. Не могу понять в чем преимущество ESPAsyncWebServer?
Всему есть свое применение. для простых задач вполне достаточно и стокового. К тому же для статических файлов можно добавить Cache control. тогда клиент вообще не будет их постоянно спрашивать .
Но здесь был вопрос в другом и поэтому ответ был соответствующий
 

enjoynering

Well-known member
Спасибо CodeNameHawk. Действительно больше одно клиента не подключал.

yurik72, да cash control пользуюсь, но агрессивным для для JS и gzip (в котром у меня сохранены все сторонние библиотеки типа jQuery и тд). Дело в том, что если кешировать html, то потом неадекватно поведение browser при logout (у меня логин и пароль шифруются и сохраняются в cookies на стороне клиента и даже если почистить cookies browser первый раз може вывалить битую страницу из кеша)

/************************************************************************************/
/*
server_sendCacheControlHeader

Send server additional Cache-Control HTTP request header

NOTE:
- 0 = no cache
- 1 = cache for 1 day
- 2 = cache for for 7 days (for Chrome) & always cache (for Firefox)
- see https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching
*/
/************************************************************************************/
void server_sendCacheControlHeader(uint8_t type)
{
switch (type)
{
case 0:
server.sendHeader(F("Cache-Control"), F("private, no-store")); //ask to never store on ISP server side, but browser can cache it
break;

case 1:
server.sendHeader(F("Cache-Control"), F("private, max-age=86400")); //ask to never store on ISP server side, browser cache for 1 day, in seconds
break;

case 2:
server.sendHeader(F("Cache-Control"), F("public, max-age=604800, immutable")); //ask to always cache on ISP server & browser for 7 days, this resource never change
break;

default:
server.sendHeader(F("Cache-Control"), F("private, no-store"));
break;
}
}
 
Сверху Снизу