Официальный почтовый запрос библиотеки 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);

, 👍0

Обсуждение

и значение host?, @Juraj

client — это экземпляр объекта 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


1 ответ


Лучший ответ:

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