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

Не получается отправить json запрос с ESP8266

alexhi

Member
Здравствуйте! Подскажите по такому вопросу.
Есть сервер на котором отображаются графики по присылаемым данным в формате json.
Если я посылаю запрос программой rastman методом POST такого вида:

"{\"dt\":\"\",\"points\":[1,2,3,4,5,6]}"
то все нормально отображается
Если пытаюсь из ESP8266 послать

http.begin(ht, "http://XX.XX.11.22:85/data");
http.addHeader("Content-Type", "text/json");
int httpCode = http.POST("{\"dt\": \"2020\",\"points\":[1,2,3,4,5,6]}");

Пишет ошибка код 400 . На самом сервере к сожалению не могу посмотреть что прилетает. Но знаю он на Windows.
использую <ESP8266HTTPClient.h>. В чем может быть дело?
 

alexhi

Member
Я пробывал сначала так как http.addHeader("Content-Type", "application/json"); Ошибка та же, а это написал http.addHeader("Content-Type", "text/json"); Так как в программе rastman выбирается так и это работает.
1.JPG
 

alexhi

Member
ок, спасибо попробую. У меня кстати получилось отправить там трабла с экранированием была . С ESP вот так надо отсылать было этот запрос:
http.begin(ht, "http://XX.213.91.58:85/data");
http.addHeader("Content-Type", "text/json");
Serial.print("[HTTP] POST..........\n");
String msg="\"{\\\"dt\\\":\\\"2020-07-24\\\",\\\"points\\\"";//преамбула
msg+=":["+String(DS[1])+","+String(DS[2])+","+String(DS[3])+ ","+ String(DS[4])+","+String(DS[5])+","+String(DS[6])+","+String(counts++) +","+"8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,";
msg+="31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,";
msg+="61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,44,85,86,87,88,89,90";
msg+="]}\"";
int httpCode = http.POST(msg);

Теперь все работает.
 

enjoynering

Well-known member
зачем это кривой и нечитабельный код?

Код:
String msg="\"{\\\"dt\\\":\\\"2020-07-24\\\",\\\"points\\\"";//преамбула
msg+=":["+String(DS[1])+","+String(DS[2])+","+String(DS[3])+ ","+ String(DS[4])+","+String(DS[5])+","+String(DS[6])+","+String(counts++) +","+"8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,";
msg+="31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,";
msg+="61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,44,85,86,87,88,89,90";
msg+="]}\"";
int httpCode = http.POST(msg);
я использую ArduinoJson. вот пример сохранения Weather config в JSON формате на файловую систему LittleFS

Код:
/************************************************************************************/
/*
    fs_saveWeatherConfig()

    Save Weather config to file system in JSON format
*/
/************************************************************************************/
bool fs_saveWeatherConfig(String fileName)
{
  File configFile = LittleFS.open(fileName, "w"); //zero length existing or create file for writing, sub directories automatically created

  if (configFile != true)
  {
    Serial.printf_P(PSTR("Oops! failed to create %s\n"), fileName.c_str());

    return false;
  }

  DynamicJsonDocument jsonDoc(FS_JSON_FILE_SIZE / 2); //create json document in heap memory

  Serial.printf_P(PSTR("json maximum size %u bytes\n"), jsonDoc.capacity());

  jsonDoc["location"] = weatherConfig.location;
  jsonDoc["key"]      = weatherConfig.apiKey;

  Serial.printf_P(PSTR("json actual size %u bytes\n"), jsonDoc.memoryUsage());

  uint32_t minifiedSize = serializeJson(jsonDoc, configFile); //generate minified JSON & send it to LittleFS, return number of bytes

  configFile.close();                                         //close file to prevent memory leak

  if (minifiedSize != 0)
  {
    Serial.printf_P(PSTR("size of minified %s %u bytes\n"), fileName.c_str(), minifiedSize);

    return true;
  }

  Serial.printf_P(PSTR("Oops! failed to save %s\n"), fileName.c_str());

  return false;
}
 
Сверху Снизу