HTTP-POST возвращает 400 при учете значения от датчика
Я пытаюсь опубликовать данные total
, но он возвращает 400. но когда я пробую образец данных, как
int httpResponseCode = http.POST("{\"сумма\":\"итого\"}");
(400)
в
int httpResponseCode = http.POST("{\"сумма\":\"15\"}");
это работает (201).
Как заставить его работать? Спасибо!
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
const byte interruptPin = 4;
const int interval = 500;
volatile unsigned long tiptime = millis();
volatile float rainrate = 0.3;
volatile float total;
void ICACHE_RAM_ATTR count();
void loop() {
if ((millis() - lastTime) > timerDelay) {
//Проверить состояние подключения Wi-Fi
if (WiFi.status()== WL_CONNECTED) {
HTTPClient http;
// Ваше доменное имя с URL-путем или IP-адрес с путем
http.begin(serverName);
// Указать заголовок типа содержимого
http.addHeader("Content-Type", "application/json");
// Данные для отправки с помощью HTTP POST
int httpResponseCode = http.POST("{\"amount\":\"total\"}");
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
// Бесплатные ресурсы
http.end();
}
else {
Serial.println("WiFi Disconnected");
}
lastTime = millis();
}
}
void count() {
// Захват текущего количества мс для общих вычислений
unsigned long curtime = millis();
// Убедитесь, что мы не записываем отскоки
if ((curtime - tiptime) < interval) {
return;
}
// Сколько времени прошло с последнего чаевого?
unsigned long tipcount = curtime - tiptime;
tiptime = curtime;
total += rainrate;
Serial.println(total);
}
@Giddsec, 👍-1
Обсуждение1 ответ
Лучший ответ:
Ваша линия
int httpResponseCode = http.POST("{\"amount\":\"total\"}");
это не то, что вы думаете, что он делает. Вы помещаете в строку не содержимое переменной total, а слово
total
.
Вместо этого вам нужно создать строку из компонентов перед отправкой. Я бы использовал что-то вроде:
char temp[32];
snprintf(temp, 32, "{\"amount\":\"%.2f\"}", total);
int httpResponseCode = http.POST(temp);
Это предполагает, что функция http.POST()
будет принимать параметр char *. Если нет, то вам, возможно, придется прибегнуть к
строке
:
String temp = "{\"amount\":\"";
temp += String(total, 2);
temp += "\"}";
Однако лучше избегать String
, так как это может привести к фрагментации кучи, в результате чего ваш код со временем станет нестабильным.
Обратите внимание, что его "total" - это "float", поэтому формат должен иметь "% f" или "% g`., @Edgar Bonet
@EdgarBonet Так оно и есть..., @Majenko
Если вы собираетесь пойти по маршруту sprintf
, было бы лучше использовать snprintf
: char temp[32]; snprintf(temp, sizeof temp, "{
. Причин использовать старую версию non-n очень мало., @timemage
Я собирался это сделать, но не смог сразу вспомнить порядок первых двух аргументов., @Majenko
Спасибо! это сработало :), @Giddsec
- создание постоянного HTTP-соединения для создания «гладких» данных через GSM-отправку
- Как увеличить скорость записи на SD-карту в Ардуино
- Как публиковать запросы HTTP POST на моем веб-сайте?
- Почтовый запрос HTTP в формате JSON с использованием модуля SIM900
- Как правильно отправлять данные через http с помощью sim908?
- HTTP GET запрос с использованием Arduino Uno и ESP8266
- Как составить URL-адрес HTTP-запроса GET с параметрами ключ/значение
- ESP8266 Ошибка неверного запроса 400
В целях отладки не могли бы вы попытаться последовательно вывести точные строки, которые отправляются в обоих случаях, чтобы, возможно, найти, в чем важная разница между ними? Вы можете опубликовать результаты как редактирование вашего вопроса. Удачи вам!, @Offer