Библиотека 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?

, 👍1

Обсуждение

HTTP != HTTPS..., @Dave Newton


1 ответ


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

1

Это не ошибка, это HTTP-перенаправление.

HTTP - запрос работал, как и ожидалось, в ESP32. Curl автоматически обрабатывает перенаправление. Ваша доморощенная реализация HTTP этого не делает.

API Coinbase требует, чтобы вы использовали HTTPS и не разрешали HTTP. Это защищает личную информацию, такую как ключи API и информацию, которую API может возвращать. Это также подтверждает, что вы разговариваете с реальным сервером API Coinbase, а не с имитатором.

Вам нужно будет использовать порт 443 и WiFiClientSecure библиотеку вместо библиотеки WiFiClient. Или, что еще лучше, вы можете использовать HTTP-клиент, который уже реализует протокол HTTP, например HttpClient.

,