Официальный почтовый запрос библиотеки ESP8266 возвращает 400
Каждый раз, когда я пытаюсь отправить запрос на публикацию, я получаю сообщение об ошибке 400, но JSON и URL-адрес идентичны тем, которые я использовал в онлайн-тестере API, и это работало каждый раз. Я запускаю эту программу в официальной среде разработки Arduino, и большая часть этого кода была взята из официальной библиотеки ESP8266 здесь: https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266HTTPClient/src/ESP8266HTTPClient.h
if (http.begin(client, host)) { // HTTP
http.addHeader("Content-Type", "application/json");
// Serial.print("[HTTP] GET...\n");
// начинаем соединение и отправляем заголовок HTTP
// int httpCode = http.GET();
String request = "{ \"temperature\": 27.0, \"humidity\": 43 }";
Serial.print("[HTTP] POST...\n");
int httpCode = http.POST(request);
@pythonhelpthrow, 👍0
Обсуждение1 ответ
Лучший ответ:
400 – это ошибка HTTP "Неверный запрос", отправленная HTTP-сервером. Возможные причины этой ошибки: неправильно сформированная строка HTTP-запроса, неправильно сформированные заголовки HTTP-запроса, отсутствие пустой строки после последнего заголовка HTTP и запрос на «защищенный» порт без шифрования.
В вашем случае библиотека HttpClient формирует HTTP-запрос, поэтому ошибок быть не должно. Единственное, что вы предоставляете для запроса, — это URL-адрес, в вашем случае это переменная host
. Как мы выяснили в комментариях, ваш URL-адрес начинался с https. Библиотека HttpClient проанализировала URL-адрес, обнаружила протокол https и использовал безопасный порт 443. Но базовый сетевой объект Client не был SSL, поэтому он не шифровал запрос.
Спасибо за помощь!, @cwille97
Я ценю объяснение того, что пошло не так, но как мы можем заставить это работать?, @jezmck
@jezmck в этом случае будет использоваться WiFiSecureClient, как показано в примере BasicHttpsClient., @Juraj
- HTTP GET запрос с использованием Arduino Uno и ESP8266
- Как составить URL-адрес HTTP-запроса GET с параметрами ключ/значение
- ESP8266 Ошибка неверного запроса 400
- ESP8266 отправляет веб-страницу клиенту, но html-коды отображаются в браузере вместо веб-страницы
- Проанализировать большой ответ json с помощью ESP8266
- ESP8266 не отвечает через случайные промежутки времени
- Код запроса ESP8266 GET -1
- esp32 http client response только 200 не получил данные после этого
и значение
host
?, @Jurajclient — это экземпляр объекта WiFiClient, а host — это переменная, объявленная в URL-адресе с включенным моим закрытым ключом., @cwille97
код ошибки 400 — «Неверный запрос», и это HTTP-ответ с сервера., @Juraj
Верно, но я пытаюсь выяснить, в чем несоответствие между моим кодом и тестером API, который я использовал. JSON и URL идентичны., @cwille97
единственное, что вы указываете, это «хост» в эскизе, @Juraj
Так может быть, мой JSON отформатирован неправильно? Я просто хочу, чтобы это отображалось как {"температура": 27,0, "влажность": 43}, @cwille97
это не будет 400. 400 - это неправильная строка состояния или заголовки. может быть, какой-то недостающий заголовок?, @Juraj
Какой заголовок будет отсутствовать? я не очень знаком, @cwille97
некоторые недопустимые символы в URL (
host
), которые должны быть закодированы? пробел или %, @JurajЯ не думаю, что есть недопустимые символы. Формат следующий: https://redacted.redacted.net/some/stuff/here/fad34552435jdasfaghh8?private_key=8342yfsadh4jh38fh27df8., @cwille97
протокол https?, @Juraj
Вот рекомендуемый cURL из документации: curl -H "Content-Type: application/json" -X POST \ -d '{ "отметка времени": 1541519720, "значение": 76,5 }' \ https://myfarm.farmos.net/farm/sensor/listener/xxxxxx?private_key=yyyyyy, @cwille97
О, это https://, может быть, это моя проблема?, @cwille97
https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266HTTPClient/examples/BasicHttpsClient/BasicHttpsClient.ino, @Juraj
Я изменил URL-адрес на http, и теперь он выдает ошибку 301, перемещенную навсегда. Вместо этого я рассмотрю пример HTTPS, причина, по которой я избегал, заключалась в том, что у них был отпечаток с истекшим сроком действия, поэтому я не был уверен, сработает ли он (честно говоря, даже не знаю, для чего нужен отпечаток)., @cwille97
Я использовал какой-то онлайн-генератор для отпечатка пальца и переключился на HTTPS, и он работает, и данные JSON отображаются на сервере. Спасибо за вашу помощь. Поскольку вы решили мой вопрос, если вы хотите опубликовать что-то в качестве ответа, я отмечу вас как ответ., @cwille97