Нужна помощь Формирование строки параметров в формате json

Pilnikov

New member
Опять аякс, опять json
Поделитесь примером плиз/ткните носом как передать данные с веб страницы на сервер в формате json
посредством new XMLHttpRequest(); метод GET (можно POST)
Щас так: url='/set_pars?utsi_t='+utsi_t;
потом на сервере так:
void handleSetPars()
{
uint8_t i = 0;
conf_data.use_ts_i = server.arg(i) == "1";
i++;
}
Как уйти от server.arg(i) заменив на

{
StaticJsonBuffer<1500> jsonBuffer;
JsonObject& json = jsonBuffer.parseObject(buf.get());

if (!json.success()) DBG_OUT_PORT.println("Failed to parse config file");
else
{
data.use_ts_i = json["use_ts_i"];
}
Грубо, как поиметь строку передаваемых параметров?

Как правильно сформировать строку параметров "url" используя встроенные средства json
Спасибо
 
Последнее редактирование:

Юрий Ботов

Moderator
Команда форума
А нужна ли библиотека JSON занимающая кучу места и ресурсов для такой простой задачи как возврат json с сервера? Она больше для "парсенья".

поэтому url='/set_pars?pars={"s":" '+"строка"+' ", "i":' +123+', "a":[1,2,3,4]}'; // пробелы между ковычками - только для наглядности, их разумеется быть не должно

Модное слово json это не более чем текстовый формат записи объектов JavaScript...
 

pvvx

Активный участник сообщества
Опять аякс, опять json
Поделитесь примером плиз/ткните носом как передать данные с веб страницы на сервер в формате json
посредством new XMLHttpRequest(); метод GET (можно POST)
В запросе, в url не бывает Json. Там RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax.
Json бывает только в POST.
И желательно избегать передачу длинных запросов в URI, тем более они увеличиваются на кодировку специальных символов в формате с %xx.
URI — сложно о простом (Часть 1)
RegExp поставите в ESP на разбор запроса?
 
Последнее редактирование:

pvvx

Активный участник сообщества
Ты с моим систем-архитектором не общался. Бывает. И в запросе и в ответе. Да обычно в POST.
Я знаю, что бывает всё - отсебятины всегда куча. Каждый норовит создать исключение из правил - вы(делить/е..)ся. :)
Где-то валялась статья, где люди просто проверяли максимальную длину в URI на текущих серваках в инет. Вышло, что не тянут и 2 кило. Хотя установки для серваков позволяют и больше, но не все способны настроить. :) Моя веб-свалка и то жрет длиннее строку... :)
 

Юрий Ботов

Moderator
Команда форума
И желательно избегать передачу длинных запросов в URI, тем более они увеличиваются на кодировку специальных символов в формате с %xx.
Но при этом лучше один длинный чем два коротких...

(черт бы подрал автомат который исправляет то что я написал!!!)
 

pvvx

Активный участник сообщества
Но при этом лучше один длинный чем два коротких...
Но не на ESP. Там чаще всего заголовок запроса HTTP ограничен на один пакет (1460 байт) или буфер в стеке на 1024 кило :) Когда у вас куки и прочий хлам, то запрос, к примеру у хрома становиться длиннее 4-х кило и ESP уже ничего не жрет. Ещё смешная ситуация на либах у ESP - не жрут разбитый на пакеты HTTP запрос. Например микрософт эксплорер разбивает заголовок на сегменты по типам, учитывая внешние MTU или ещё чаго-то... Часть либ на ESP такое тоже не жрет. Дет-сад писал.
Но есть либы, учитывающие всё это... У меня в web-свалке заголовок может приходить хоть по одному байту на пакет TCP - можно набирать вручную типа в телнет (передающем набираемые символы вручную по одному в поток TCP) :)
Ну а т.к. везде разная "хохлама", то и рекомендуют не создавать длинные заголовки запроса HTTP.

Топикастера это особо касается - он хочет натравить процедуру Json на разбор длинющей строки, а она должна быть вся предварительно помешена в буфер RAM, которой в ESP маловато :)

А так вообще Json в uri – это полный прикол. Формат создавался для читаемости человеком, но после разбавления %xx он превращается в машинную кашу. “Хотели как лучше, а вышло … “ :)
По тому его сменит новый стандарт HTTP... (с передачей бинарных данных :) )

В Microsoft Internet Explorer максимальная длина URL-адреса ограничена 2083 символами. Кроме того, максимально допустимая длина пути в Internet Explorer составляет 2048 символов. Эти ограничения относятся к URL-адресам как для запросов POST, так и для запросов GET.
https://support.microsoft.com/ru-ru...ngth-is-2,083-characters-in-internet-explorer
 
Последнее редактирование:

Pilnikov

New member
Вы опять глубоко в лес ушли. Не надо мне таких объемов. Максимальный размер буфера 1500 байт. Я использовал json у себя в проекте для файла config. Файл размером в 700 байт кодируется и декодируется вполне себе. Получается довольно красивый и наглядный код. Мне это все нужно для удобства. При разборе строки методом server.arg необходимо четко придерживаться последовательности принимаемых данных. В случае же с json - парсер сам разложит все по полкам. (+ в форме кодировщик сложит все автоматом)
 

Victor

Administrator
Команда форума
При разборе строки методом server.arg необходимо четко придерживаться последовательности принимаемых данных. В случае же с json - парсер сам разложит все по полкам. (+ в форме кодировщик сложит все автоматом)
JSON библиотеку тут использовать нецелесообразно - наоборот неудобно становится и памяти много жрет.
Но [inline]server.arg(i)[/inline] действительно неудобен в вашем случае. Гораздо удобнее использовать [inline]server.arg("utsi_t")[/inline] - это встроенный JSON-подобный парсер. Также доступны и другие удобные методы. Смотрите исходники библиотеки вебсервера и все станет более понятно Arduino/ESP8266WebServer.h at master · esp8266/Arduino · GitHub

Можно сделать универсальный парсер - цикл по [inline]server.arg(i)[/inline], извлекаем имя по индексу [inline]x = server.argName(i)[/inline] и получаем значение [inline]server.arg(x)[/inline]

P.S. Не удивляйтесь - [inline]server.arg()[/inline] перегруженная функция и может принимать как числовые так и строковые аргументы
 

pvvx

Активный участник сообщества
Вы опять глубоко в лес ушли. Не надо мне таких объемов. Максимальный размер буфера 1500 байт. Я использовал json у себя в проекте для файла config. Файл размером в 700 байт кодируется и декодируется вполне себе.
Уже не лезет, если учесть перекодировку до двух третьих объема строки в 700 байт в %xx код. :p
700/3+(700*2/3)*3 > 1500 ! :)
 
Последнее редактирование:

Pilnikov

New member
JSON библиотеку тут использовать нецелесообразно - наоборот неудобно становится и памяти много жрет.
Но [inline]server.arg(i)[/inline] действительно неудобен в вашем случае. Гораздо удобнее использовать [inline]server.arg("utsi_t")[/inline] - это встроенный JSON-подобный парсер. Также доступны и другие удобные методы. Смотрите исходники библиотеки вебсервера и все станет более понятно Arduino/ESP8266WebServer.h at master · esp8266/Arduino · GitHub

Можно сделать универсальный парсер - цикл по [inline]server.arg(i)[/inline], извлекаем имя по индексу [inline]x = server.argName(i)[/inline] и получаем значение [inline]server.arg(x)[/inline]

P.S. Не удивляйтесь - [inline]server.arg()[/inline] перегруженная функция и может принимать как числовые так и строковые аргументы
Спасибо - это помогло / получилось
 

Pilnikov

New member
Victor, не пинайте сильно - я слаб в определениях, а функция, возвращающая целиком строку параметров, существует?
может эта
String uri() { return _currentUri; } ?????
 
Последнее редактирование:
Сверху Снизу