• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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;
}
 
Сверху Снизу