Библиотека WiFi.h, проблемы с client.print()
У меня есть плата разработки esp32, которую я пытаюсь использовать для получения данных о ценах на биткойны с помощью API Coinbase.
На веб-сайте разработчиков Coinbase они приводят этот пример команды Curl для получения данных о цене биткоина:
curl https://api.coinbase.com/v2/prices/spot?currency=USD
Я ввел это в командную строку на своем компьютере, и она работает так, как ожидалось. Поэтому я использовал это в качестве шаблона для своего оператора HTTP get в своем скетче Arduino.
if (!client.connect("api.coinbase.com",80)) {
Serial.println("Connection failed.");
}
delay(100);
client.print("GET /v2/prices/spot?currency=USD HTTP/1.1\r\nHost: api.coinbase.com\r\n\n");
Однако при отправке с моего esp32 я получаю ошибку "301 Перемещен навсегда". Но новое местоположение, указанное в ответе, - это именно то, к чему я обращался в первую очередь!
HTTP/1.1 301 Moved Permanently
Date: Sun, 22 Aug 2021 22:15:50 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Cache-Control: max-age=3600
Expires: Sun, 22 Aug 2021 23:15:50 GMT
Location: https://api.coinbase.com/v2/prices/spot?currency=USD
Set-Cookie: __cf_bm=ea2a2031c3fa42b910632c627d2ed4c48824323d-1629670550-1800-ARKBVsdI9BWVOOTWmKXp+cMv0hcxMU4YAOR1JyHtH2Q49TEBkGuGNXLxSMIanzC7W8Ga9uXBCtdo+Th7Fgir8Jc=; path=/; expires=Sun, 22-Aug-21 22:45:50 GMT; domain=.coinbase.com; HttpOnly
X-Content-Type-Options: nosniff
Server: cloudflare
CF-RAY: 682f764a88f3a3eb-PIT
Почему этот HTTP - запрос работает с Curl, но не при отправке с esp32?
@Nick, 👍1
Обсуждение1 ответ
Лучший ответ:
Это не ошибка, это HTTP-перенаправление.
HTTP - запрос работал, как и ожидалось, в ESP32. Curl автоматически обрабатывает перенаправление. Ваша доморощенная реализация HTTP этого не делает.
API Coinbase требует, чтобы вы использовали HTTPS и не разрешали HTTP. Это защищает личную информацию, такую как ключи API и информацию, которую API может возвращать. Это также подтверждает, что вы разговариваете с реальным сервером API Coinbase, а не с имитатором.
Вам нужно будет использовать порт 443 и WiFiClientSecure
библиотеку вместо библиотеки WiFiClient. Или, что еще лучше, вы можете использовать HTTP-клиент, который уже реализует протокол HTTP, например
HttpClient
.
- ESP32-S3 — HttpClient возвращает только код состояния 200 без данных полезной нагрузки JSON
- передать «большой» массив измерений на сервер через Wi-Fi
- ESP32 - "Детектор Браунаута был активирован" при запуске Wi-Fi
- Контакты RX и TX на esp32
- Почему OTA не работает с платой ESP32-CAM Ai-Thinker?
- ESP32 открывает "captive portal" при подключении
- Аналоговое чтение не работает при использовании WiFi
- Автоматическая веб-страница ESP32 AP
HTTP != HTTPS..., @Dave Newton