Передать или получить массив по HTTP

DyadyaGenya
Offline
Зарегистрирован: 23.06.2022

Доброго времени суток. Что-то я подзапутался. Не пойму, как передать/получить массив по HTTP. Вообще хочу передать массивом значение статусов реле. По одному передаю строкой. Получается. Массивом пока не могу придумать.

Допустим есть массив:

int arrayStatus[] = {0,0,0,0,0,0,0,0};

Естественно, его значение может меняться. Но это не важно, как должен выглядеть HTTP запрос/ответ? Понимаю, что приблизительно так, но массив не строка, потому не работает

  server.on("/chek_status", [](){
    server.send(200, "text/html", arrayStatus);
    delay(100);
  });

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Потому что любой массив можно передать строкой с разделителями. При отправке сформировать строку, при получении распарсить.

Например:

{address}/?rele1=0&rele2=0&rele3=0....&releN=0

Ну и другие параметры в эту строку можно «запихать»

sadman41
Offline
Зарегистрирован: 19.10.2016

8 значений можно байтом передать. Каждый бит - состояние. Одно число в реквесте.

b707
Offline
Зарегистрирован: 26.05.2017

только надо учитывать, что при любом способе передачи. отличном от text/html - нужно еще уметь принять эти данные на стороне приемника. Обычный браузер ничего не знает о том, как например из 1 байта извлечь 8 статусов реле :)

DyadyaGenya
Offline
Зарегистрирован: 23.06.2022

BOOM пишет:

Потому что любой массив можно передать строкой с разделителями. При отправке сформировать строку, при получении распарсить.

Например:

{address}/?rele1=0&rele2=0&rele3=0....&releN=0

Ну и другие параметры в эту строку можно «запихать»

Да, но у меня что-то не получается собрать элементы массива в строку. Это одна из загвоздок.

DyadyaGenya
Offline
Зарегистрирован: 23.06.2022

sadman41 пишет:

8 значений можно байтом передать. Каждый бит - состояние. Одно число в реквесте.

Тоже думал и читал что-то о таком, но не понял как сделать. Типа можно сразу как-то прочитать состояние пинов в байты. И вроде как какие-то PINA, PINB, PINC и PIND используются. Но не нашел как это сделать. И если вдруг 16 пинов? Передать два байта?

DyadyaGenya
Offline
Зарегистрирован: 23.06.2022

b707 пишет:

только надо учитывать, что при любом способе передачи. отличном от text/html - нужно еще уметь принять эти данные на стороне приемника. Обычный браузер ничего не знает о том, как например из 1 байта извлечь 8 статусов реле :)

Это понятно ))) Браузер вообще почти ничего не умеет. Для этого джаваскрипт нужен. К сожалению php на ардуину не запихнешь.

b707
Offline
Зарегистрирован: 26.05.2017

DyadyaGenya пишет:

Да, но у меня что-то не получается собрать элементы массива в строку. Это одна из загвоздок.

Вывести в монитор порта строку "Rele1=ON" можете? А в чем разница со строкой?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

DyadyaGenya пишет:

BOOM пишет:

Потому что любой массив можно передать строкой с разделителями. При отправке сформировать строку, при получении распарсить.

Например:

{address}/?rele1=0&rele2=0&rele3=0....&releN=0

Ну и другие параметры в эту строку можно «запихать»

Да, но у меня что-то не получается собрать элементы массива в строку. Это одна из загвоздок.

Чо там может не получаться? Не знаешь просто.

int arrayStatus[] = {0,0,0,0,0,0,0,0};
int arraySize = size (arrayStatus) / arrayStatus[0];
String resStr = "?";

for (int i = 0; i < arraySize; i++) {
   resStr + = "rele" + i + "=" + arrayStatus [i] + "&";
}

И всего делов то...

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Этта шо?

BOOM пишет:

int arraySize = size (arrayStatus) / arrayStatus[0];

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

DetSimen пишет:

Этта шо?

BOOM пишет:

int arraySize = size (arrayStatus) / arrayStatus[0];

Этта нехрен тарапиццо )))))

int arraySize = sizeof (arrayStatus) / sizeof (arrayStatus[0]);

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

BOOM пишет:

DetSimen пишет:

Этта шо?

BOOM пишет:

int arraySize = size (arrayStatus) / arrayStatus[0];

Этта нехрен тарапиццо )))))

int arraySize = sizeof (arrayStatus) / sizeof (arrayStatus[0]);

 

Дидада таг делать! ;))

Это же учебник по С++! Размер массива вынимаиццо шаблоном.

Исключим всех из программистов и отправим снег в Сибири убирать. Весь!

template<typename T, size_t N> 
printSize (T (&)[N] ) 
{
  if (Serial) Serial.println((int)N);
} 

char c[] = "0123456789abc";
int i[] = {1,2,3,4,5,6};


void setup() {
  // put your setup code here, to run once:
Serial.begin(115200);

float f[] = {1.1, 2.2, 3.3, 4.4};

printSize(c);
printSize(i);
printSize(f);
}

void loop() {
  // put your main code here, to run repeatedly:

}

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Йа шаблоны не умею, йа не настоящий программист.... ))))

Как вот сделать, чтобы получить это значение, а не напечатать в сериал?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

BOOM пишет:

Йа шаблоны не умею, йа не настоящий программист.... ))))

Как вот сделать, чтобы получить это значение, а не напечатать в сериал?

Мне бабушка в детстве про оператор return по секрету рассказывала! ;))

Тып, все-таки, почитал учебник по С++. Давно же на форуме. Неужели не интересно, как на самом деле программировать надо?

----------------

UPDATE

Вот это пример из учебника по С++. Не скажу - из какого, памойму - из ЛЮБОГО!

template<typename T, int size>
int GetArrLength(T(&)[size]){return size;}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

У меня любительский вопрос: в контексте операции взятия длины массива чем отличается на выходе темплейт от дефайна?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

wdrakula пишет:

Мне бабушка в детстве про оператор return по секрету рассказывала! ;))

короче - загубленное детство, а мы по скалам, пещерам, рощам, рыбу карбидом или усача на донку и, купаться, купаться и еще раз купаться (если лето)

b707
Offline
Зарегистрирован: 26.05.2017

ступил

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:
У меня любительский вопрос: в контексте операции взятия длины массива чем отличается на выходе темплейт от дефайна?

тем что шаблонную функцию фиг положищь в .cpp файл - не скомпилится :)

DyadyaGenya
Offline
Зарегистрирован: 23.06.2022

b707 пишет:

Вывести в монитор порта строку "Rele1=ON" можете? А в чем разница со строкой?

Например так (оставляем только то, что касается перебора массива):

int arrayStatus[] = {0,0,0,0,0,0,0,0};
char* arrayPins[] = {"pin_D1","pin_D2","pin_D3","pin_D4","pin_D5","pin_D6","pin_D7","pin_D8"};
int arrayNamePins[] = {pin_D1,pin_D2,pin_D3,pin_D4,pin_D5,pin_D6,pin_D7,pin_D8};

void setup() {
  chekStatus()
}

void chekStatus() {
  for (i = 0; i < count; i++) {
      arrayStatus[i] = digitalRead(arrayNamePins[i]);
      if (arrayStatus[i] == 1) 
      {
        Serial.println(arrayPins[i]+(String)" = ON");
      }
      else 
      {
        Serial.println(arrayPins[i]+(String)" = OFF");
      }
  }
}

А вот про разницу со строкой не понял, что именно вас интересует?

DyadyaGenya
Offline
Зарегистрирован: 23.06.2022

BOOM пишет:

Чо там может не получаться? Не знаешь просто.

int arrayStatus[] = {0,0,0,0,0,0,0,0};
int arraySize = size (arrayStatus) / arrayStatus[0];
String resStr = "?";

for (int i = 0; i < arraySize; i++) {
   resStr + = "rele" + i + "=" + arrayStatus [i] + "&";
}

И всего делов то...

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




void to_string() {
//String resStr = "?";   // делал и такой вариант, тоесть объявлял внутри функции, а не в начале скетча

for (int i = 0; i < count; i++) {
   resStr + = "rele" + i + "=" + arrayStatus [i] + "&";   //  ругается на эту строку
  }
Serial.println(resStr);

}

 

DyadyaGenya
Offline
Зарегистрирован: 23.06.2022

wdrakula пишет:

BOOM пишет:

DetSimen пишет:

Этта шо?

BOOM пишет:

int arraySize = size (arrayStatus) / arrayStatus[0];

Этта нехрен тарапиццо )))))

int arraySize = sizeof (arrayStatus) / sizeof (arrayStatus[0]);

 

Дидада таг делать! ;))

Это же учебник по С++! Размер массива вынимаиццо шаблоном.

Исключим всех из программистов и отправим снег в Сибири убирать. Весь!

template<typename T, size_t N> 
printSize (T (&)[N] ) 
{
  if (Serial) Serial.println((int)N);
} 

char c[] = "0123456789abc";
int i[] = {1,2,3,4,5,6};


void setup() {
  // put your setup code here, to run once:
Serial.begin(115200);

float f[] = {1.1, 2.2, 3.3, 4.4};

printSize(c);
printSize(i);
printSize(f);
}

void loop() {
  // put your main code here, to run repeatedly:

}

 

К сожалению я не сишник. Но если вставить в Ардуино Иде, то код не работает, вот так ругается:

error: ISO C++ forbids declaration of 'printSize' with no type [-fpermissive]

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

wdrakula пишет:

BOOM пишет:

Йа шаблоны не умею, йа не настоящий программист.... ))))

Как вот сделать, чтобы получить это значение, а не напечатать в сериал?

Мне бабушка в детстве про оператор return по секрету рассказывала! ;))

Тып, все-таки, почитал учебник по С++. Давно же на форуме. Неужели не интересно, как на самом деле программировать надо?

----------------

UPDATE

Вот это пример из учебника по С++. Не скажу - из какого, памойму - из ЛЮБОГО!

template<typename T, int size>
int GetArrLength(T(&)[size]){return size;}

 

Дык о return первым делом подумал. Но в функциях знаю как. До шаблонофф не дорос. Да и не нужны они мне - я не настоящий программист. Мне и того (что выше привёл) хватает... Без обид, надеюсь?)

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

DyadyaGenya пишет:

BOOM пишет:

Чо там может не получаться? Не знаешь просто.

int arrayStatus[] = {0,0,0,0,0,0,0,0};
int arraySize = size (arrayStatus) / arrayStatus[0];
String resStr = "?";

for (int i = 0; i < arraySize; i++) {
   resStr + = "rele" + i + "=" + arrayStatus [i] + "&";
}

И всего делов то...

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




void to_string() {
//String resStr = "?";   // делал и такой вариант, тоесть объявлял внутри функции, а не в начале скетча

for (int i = 0; i < count; i++) {
   resStr + = "rele" + i + "=" + arrayStatus [i] + "&";   //  ругается на эту строку
  }
Serial.println(resStr);

}

Дык, ёмоё, я показал идею как можно делать (ты же сказал, что не понимаешь КАК), сам код даже не пытался компилировать. Уж дальше сам. А если так всё тяжко, то повременил бы. Диодиком помигай, релюшкой по щёлкай.

Одно дело подсказать, другое дело сделать ЗА ТЕБЯ. Да и что значит НЕ РАБОТАЕТ? Это общие слова. Ошибка? Или что? Покажи лог, расскажи развёрнуто.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

DyadyaGenya пишет:

К сожалению я не сишник. Но если вставить в Ардуино Иде, то код не работает, вот так ругается:

error: ISO C++ forbids declaration of 'printSize' with no type [-fpermissive]

Нет. Это не правда. Не нужно пользоваться старыми версиями IDE.

Смешно, но ровно на эту же тему был тут эль шкандаль. Вот именно на шаблон и старую версию и эту ошибку!

Тебе - простительно. Ты, всё таки, чайник. Но тот дииспут был с программистом.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

wdrakula пишет:

DyadyaGenya пишет:

К сожалению я не сишник. Но если вставить в Ардуино Иде, то код не работает, вот так ругается:

error: ISO C++ forbids declaration of 'printSize' with no type [-fpermissive]

Нет. Это не правда. Не нужно пользоваться старыми версиями IDE.

Смешно, но ровно на эту же тему был тут эль шкандаль. Вот именно на шаблон и старую версию и эту ошибку!

Тебе - простительно. Ты, всё таки, чайник. Но тот дииспут был с программистом.

а так работает )))


template<typename T, size_t N>
void printSize (T (&)[N] ) 
{
  if (Serial) Serial.println((int)N);
} 

char c[] = "0123456789abc";
int i[] = {1,2,3,4,5,6};


void setup() {
  // put your setup code here, to run once:
Serial.begin(115200);

float f[] = {1.1, 2.2, 3.3, 4.4};

printSize(c);
printSize(i);
printSize(f);
}

void loop() {
  // put your main code here, to run repeatedly:

}

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ua6em пишет:

а так работает )))

а это - ты молодец!!! Это правильное исправление. И мой недочет!

DyadyaGenya
Offline
Зарегистрирован: 23.06.2022

BOOM пишет:

Дык, ёмоё, я показал идею как можно делать (ты же сказал, что не понимаешь КАК), сам код даже не пытался компилировать. Уж дальше сам. А если так всё тяжко, то повременил бы. Диодиком помигай, релюшкой по щёлкай.

Одно дело подсказать, другое дело сделать ЗА ТЕБЯ. Да и что значит НЕ РАБОТАЕТ? Это общие слова. Ошибка? Или что? Покажи лог, расскажи развёрнуто.

За меня делать не обязательно ))) И я думал, что достаточно того коментария с указанием строки, на которую ругается.

Но в принципе, тут не прав, нужно было и правда более развернуто привести ошибку. Это именно ошибка, не предупреждение (варнинг)

In function 'void to_string()':
error: expected primary-expression before '=' token
error: invalid operands of types 'const char*' and 'const char [2]' to binary 'operator+'

А релюшкой мигаю ))) как раз осталось передать на страничку управления вшитую в ардуинку (esp8266). Я выделил место под фтп, залил туда индекс.штмл с джавоскриптом и мигаю релюшкой по одному индикатору. Можно тупо руками сразу все прописать, но хочется красиво с массивами. С датчиками, движками и прочим пока не связывался. Не нужно в первую очередь.

Пы.Сы. Жаль, что не понял, что вы привели только принципиальную схему. Думал дали уже готовый код.

DyadyaGenya
Offline
Зарегистрирован: 23.06.2022

wdrakula пишет:

DyadyaGenya пишет:

К сожалению я не сишник. Но если вставить в Ардуино Иде, то код не работает, вот так ругается:

error: ISO C++ forbids declaration of 'printSize' with no type [-fpermissive]

Нет. Это не правда. Не нужно пользоваться старыми версиями IDE.

Смешно, но ровно на эту же тему был тут эль шкандаль. Вот именно на шаблон и старую версию и эту ошибку!

Тебе - простительно. Ты, всё таки, чайник. Но тот дииспут был с программистом.

У меня знаний и выдумки не хватит придумать пример лога ошибки ))))) Я ж не зря написал/про цитировал ошибку. Она не с неба взялась. И пользуюсь версией 2, даже не 1.18.13. Правда она портативная, и уже успел заметить как минимум один баг. Не хватает скорости обмена 74880. Из-за чего у меня идут крякозябры. Мне тут не верили и пришлось даже скрин показать. После чего отправили учить мат часть по работе интерфейса UATR. Только так и не пояснили, как это связано и как мне поможет настроить мою портативную Ардуино Иде 2, честно скачанную с офсайта.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DyadyaGenya пишет:

Только так и не пояснили, как это связано и как мне поможет ...

всё старо как мир -"лучшее враг хорошего!"

Перевожу на обывательский, поставь 1.8.19 и не выпендривайся...

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

DyadyaGenya пишет:

Но в принципе, тут не прав, нужно было и правда более развернуто привести ошибку. Это именно ошибка, не предупреждение (варнинг)

In function 'void to_string()':
error: expected primary-expression before '=' token
error: invalid operands of types 'const char*' and 'const char [2]' to binary 'operator+'

Явное приведение типа нужно. Вот так у меня компилируется:

String resStr = "?";

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

  int arrayStatus[] = {0, 0, 0, 0, 0, 0, 0, 0};
  int arraySize = sizeof (arrayStatus) / sizeof (arrayStatus[0]);

  for (int i = 0; i < arraySize; i++) {
    resStr += String("rele") + String(i) + String("=") + String(arrayStatus [i]) + String("&");
  }

}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println (resStr);
  delay (1000);
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

resStr += String("rele") + String(i) + String("=") + String(arrayStatus [i]) + String("&");

очень затратно в плане памяти и быстродействия.  проще сначала слить все при помощи sprintf, а уж потом, если так надо, преобразовать в String

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Да это же как пример, а там пусть аффтар сам думает - как ему угодно... )))

ЗЫ: Относительно Atmega8 с Serial:

Скетч использует 3328 байт (40%) памяти устройства. Всего доступно 8192 байт.
Глобальные переменные используют 214 байт (20%) динамической памяти, оставляя 810 байт для локальных переменных. Максимум: 1024 байт.

Без Serial:

Скетч использует 2274 байт (27%) памяти устройства. Всего доступно 8192 байт.
Глобальные переменные используют 37 байт (3%) динамической памяти, оставляя 987 байт для локальных переменных. Максимум: 1024 байт.

Без Serial да еще за комментировал 11 строку:

Скетч использует 1612 байт (19%) памяти устройства. Всего доступно 8192 байт.
Глобальные переменные используют 27 байт (2%) динамической памяти, оставляя 997 байт для локальных переменных. Максимум: 1024 байт.

 

DyadyaGenya
Offline
Зарегистрирован: 23.06.2022

ua6em пишет:

всё старо как мир -"лучшее враг хорошего!"

Перевожу на обывательский, поставь 1.8.19 и не выпендривайся...

Дело в том, что вторая версия понимает русский язык в названии скетча и может автозавершать код. Пусть и несколько обрезано, но для такого невнимательного человека как я, это большое подспорье.

Но это не поясняет как знание UART помогло бы с настройкой программы.

DyadyaGenya
Offline
Зарегистрирован: 23.06.2022

BOOM пишет:

Явное приведение типа нужно. Вот так у меня компилируется:

Да, так компилирует.

А чем отличается запись типа:

resStr += (String)"rele" + (String)i + (String)"=" + (String)arrayStatus [i] + (String)"&";

от вашего варианта:

resStr += String("rele") + String(i) + String("=") + String(arrayStatus [i]) + String("&");

И хочу признаться, что ступил, делал похожий вариант, но не подумал, что нужно ещё и переменные в стринг перевести. По инерции только слова и символы сделал стрингом.

DyadyaGenya
Offline
Зарегистрирован: 23.06.2022

DetSimen пишет:

resStr += String("rele") + String(i) + String("=") + String(arrayStatus [i]) + String("&");

очень затратно в плане памяти и быстродействия.  проще сначала слить все при помощи sprintf, а уж потом, если так надо, преобразовать в String

Попробую и так.

Но у меня появилась мысль все перевести в JSON. Но, к сожалению, не научен понимать, где больше затрат памяти.

sadman41
Offline
Зарегистрирован: 19.10.2016

Везде кроме прямого принта.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

DyadyaGenya пишет:

BOOM пишет:

Явное приведение типа нужно. Вот так у меня компилируется:

Да, так компилирует.

А чем отличается запись типа:

resStr += (String)"rele" + (String)i + (String)"=" + (String)arrayStatus [i] + (String)"&";

от вашего варианта:

resStr += String("rele") + String(i) + String("=") + String(arrayStatus [i]) + String("&");

И хочу признаться, что ступил, делал похожий вариант, но не подумал, что нужно ещё и переменные в стринг перевести. По инерции только слова и символы сделал стрингом.

В моем примере - явное приведение типа, что такое вы изобразили - понятия не имею.

DyadyaGenya
Offline
Зарегистрирован: 23.06.2022

BOOM пишет:

В моем примере - явное приведение типа, что такое вы изобразили - понятия не имею.

Видел такие примеры на буржуйских форумах. Причем они работают. И я в этой же теме, кроме этого примера,  несколькими постами выше привел вполне себе рабочий пример такого использования. Правда я плохо знаю англ, потому не совсем понял перевод, но типа тоже явное приведение к типу стринг, но вроде как быстрое.

DyadyaGenya
Offline
Зарегистрирован: 23.06.2022

sadman41 пишет:
Везде кроме прямого принта.

Не понял, о чем это. Это про затраты памяти?

b707
Offline
Зарегистрирован: 26.05.2017

DyadyaGenya пишет:

 И я в этой же теме,  несколькими постами выше привел вполне себе рабочий пример такого использования.

типа тоже явное приведение к типу стринг, но вроде как быстрое.

в каком сообщении?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

DyadyaGenya пишет:

Видел такие примеры на буржуйских форумах. Причем они работают.

Никто и не сомневался )))

resStr += static_cast<String>("rele") + static_cast<String>(i) + static_cast<String>("=") + static_cast<String>(arrayStatus [i]) + static_cast<String>("&");

Лучше переходи к следующему этапу, если строку сформировать уже можешь.)

sadman41
Offline
Зарегистрирован: 19.10.2016

DyadyaGenya пишет:

sadman41 пишет:
Везде кроме прямого принта.

Не понял, о чем это. Это про затраты памяти?


Конечно.

DyadyaGenya
Offline
Зарегистрирован: 23.06.2022

b707 пишет:

DyadyaGenya пишет:

 И я в этой же теме,  несколькими постами выше привел вполне себе рабочий пример такого использования.

типа тоже явное приведение к типу стринг, но вроде как быстрое.

в каком сообщении?

Сообщение вот https://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/peredat-ili-poluchit-massiv-po-http#comment-659555

Только у меня появились сомнения о взаимопонимании... Имелось ввиду, что такая запись как у меня быстрее по утверждениям англоязчных форумов (на том уровне, что я понимаю англ язык)

DyadyaGenya
Offline
Зарегистрирован: 23.06.2022

BOOM пишет:

DyadyaGenya пишет:

Видел такие примеры на буржуйских форумах. Причем они работают.

Никто и не сомневался )))

resStr += static_cast<String>("rele") + static_cast<String>(i) + static_cast<String>("=") + static_cast<String>(arrayStatus [i]) + static_cast<String>("&");

Лучше переходи к следующему этапу, если строку сформировать уже можешь.)

Например я сомневаюсь, как лучше. Сам оценить не могу.

И с этим этапом нужно ещё разбираться. СТрока то формируется, но она каждый раз удлиняется. Тоесть посылаешь HTTP запрос и его результат потом висит в памяти, и новый присоединяется к старому результату.

Но я все больше смотрю в сторону джсона. Останавливает только то, что чужие парсил, а свои не составлял. Никак понять не могу, что лучше, передавать массивом или объектом. Да и что значит объектом, если результат выглядит как многоуровневый массив (ассоциативный массив, или словарь)

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

DyadyaGenya пишет:

посылаешь HTTP запрос и его результат потом висит в памяти, и новый присоединяется к старому результату.

Оправил запрос и обнулил результирующую строку. И память цела и ничего ни к чему не присоединяется. ))