MicroPython: HTTP GET-запросы с ESP32/ESP8266
Узнайте, как выполнять HTTP GET-запросы с помощью плат ESP32 или ESP8266, запрограммированных на MicroPython. Сначала мы рассмотрим основы HTTP GET-запросов, а затем создадим и разберём два разных примера с использованием библиотеки requests.
HTTP-запросы необходимы для взаимодействия с веб-сервисами, получения данных из внешних источников, интеграции с веб-API для доступа к сторонним сервисам и многого другого, как вы увидите в этом уроке.
Этот урок совместим с платами ESP32 и ESP8266.
Содержание
В этом уроке мы рассмотрим следующие темы:
Предварительные требования — прошивка MicroPython
Для прохождения этого урока вам необходима прошивка MicroPython, установленная на ваших платах ESP32 или ESP8266. Также вам нужна IDE для написания и загрузки кода на плату. Мы рекомендуем использовать Thonny IDE:
Впервые работаете с MicroPython? Ознакомьтесь с нашим курсом: Начало работы с MicroPython на ESP32 и ESP8266
Что такое HTTP-запросы?
Наиболее распространённый способ обмена данными с другим компьютером (сервером) в интернете — использование протокола HTTP.
HTTP (Hypertext Transfer Protocol) работает по модели клиент-сервер. В этой модели клиент взаимодействует с сервером с помощью HTTP-запросов. HTTP-запрос — это сообщение, отправляемое клиентом серверу, обычно для запроса определённого действия или получения информации. Сервер отправляет ответ обратно клиенту также через HTTP.
Клиент: инициирует обмен данными через запрос.
Сервер: получает и обрабатывает запрос и отправляет ответ обратно.
ESP32 может быть как клиентом, так и сервером. Когда он выступает в роли клиента, он отправляет запросы серверам. Когда он является сервером, он обрабатывает запросы клиентов. В этом уроке мы рассмотрим ESP32 и ESP8266 в роли HTTP-клиента, выполняющего запросы к серверу.
Вот несколько примеров того, что можно делать с помощью HTTP-запросов на ESP32/ESP8266:
Получение данных из интернета: например, время, текущая погода, цены акций, обновления дорожной обстановки и многое другое…
Логирование данных: отправка данных в облако для сохранения данных онлайн;
Удалённое управление ESP32: взаимодействуя с IoT-платформами, такими как Adafruit IO, Node-RED и другими — вы можете удалённо управлять платой, обмениваясь данными через HTTP-запросы;
Взаимодействие со сторонними сервисами для отправки уведомлений: SMS, электронная почта, push-уведомления и многое другое…
Технический обзор HTTP-запросов
Давайте кратко рассмотрим технические аспекты HTTP-запросов. Если вы впервые имеете дело с HTTP-запросами в техническом плане и это кажется запутанным — это совершенно нормально.
Но не волнуйтесь, существуют модули MicroPython, которые абстрагируют все технические детали, делая выполнение и обработку HTTP-запросов очень простыми. Кроме того, для получения дополнительной информации о технических аспектах HTTP-запросов мы рекомендуем следующие ресурсы:
HTTP GET-запросы
HTTP-запрос состоит из нескольких частей. Основные элементы: строка запроса, заголовки и тело.
Строка запроса
Строка запроса указывает HTTP-метод, запрашиваемый ресурс (URL) и версию используемого протокола HTTP. Распространённые HTTP-методы включают GET, POST, PUT и DELETE. Например:
GET /path/to/resource HTTP/1.1
Заголовки
Заголовки предоставляют информацию о запросе. Они могут включать хост, которому клиент отправляет запрос, тип отправляемого или принимаемого контента, user-agent (который идентифицирует клиента, выполняющего запрос) и другое. Например:
Host: example.com
User-Agent: ESP32
Accept: application/json
Тело
Тело — это необязательное содержимое, которое содержит данные или информацию, которую мы хотим отправить серверу. Оно используется в запросах POST и PUT. Например:
POST /submit-form HTTP/1.1
Content-Type: application/x-www-form-urlencoded
username=johndoe&password=secretpassword
Методы HTTP-запросов
Выбор HTTP-метода в запросе указывает на предполагаемое действие, которое должно быть выполнено на сервере. Некоторые часто используемые методы включают:
GET: получение данных с сервера.
POST: отправка данных для обработки на указанный ресурс.
PUT: обновление ресурса на сервере.
DELETE: удаление ресурса с сервера.
В этом уроке мы сосредоточимся на использовании GET-запросов с ESP32/ESP8266.
Коды состояния HTTP
После получения HTTP-запроса сервер отвечает кодом состояния HTTP, указывающим результат запроса. Коды состояния делятся на категории: 2xx (успех), 3xx (перенаправление), 4xx (ошибка клиента) и 5xx (ошибка сервера). Некоторые из наиболее распространённых:
200 OK: запрос выполнен успешно.
404 Not Found: запрашиваемый ресурс не найден.
HTTP-запросы с ESP32 и ESP8266 NodeMCU (MicroPython)
Самый простой способ выполнить HTTP-запросы с ESP32/ESP8266, запрограммированных на MicroPython — использовать библиотеку requests, которая применяет высокоуровневый подход. Она очень похожа на библиотеку requests для Python, но более ограничена.
Вы также можете использовать модуль socket, но это более низкоуровневый подход и не такой дружественный для начинающих.
Следующий код — базовый пример того, как можно выполнить простой HTTP-запрос к URL с помощью библиотеки requests. Этот пример выполняет запрос к странице на Github, которую мы создали и которая просто содержит текст «RandomNerdTutorials.com».
# Rui Santos & Sara Santos - Random Nerd Tutorials
# Complete project details: https://RandomNerdTutorials.com/micropython-http-get-requests-esp32-esp8266/
import network
import requests
import time
# Wi-Fi credentials
ssid = 'REPLACE_WITH_YOUR_SSID'
password = 'REPLACE_WITH_YOUR_PASSWORD'
# Connect to network
def connect_wifi(ssid, password):
# Connect to your network
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect(ssid, password)
# Wait for connection
timeout = 10
while not station.isconnected() and timeout > 0:
time.sleep(1)
timeout -= 1
if station.isconnected():
print('Connection successful')
print(station.ifconfig())
return True
else:
print('Connection failed. Timeout reached')
return False
if connect_wifi(ssid, password):
# Make GET request
try:
response = requests.get("https://gist.githubusercontent.com/RuiSantosdotme/9e834367f02c198bc6474938e4e3bb0d/raw/de66b26a95fc2d0b7620a43b49e57607bd4348e3/url.txt")
# Get response code
response_code = response.status_code
# Get response content
response_content = response.content
# Print results
print('Response code: ', response_code)
print('Response content:', response_content)
except Exception as e:
print('An error occurred during the request:', str(e))
else:
print('Failed to connect to WiFi')
Как работает код
Начните с импорта библиотек network и requests.
import network
import requests
Замените 'REPLACE_WITH_YOUR_SSID' и 'REPLACE_WITH_YOUR_PASSWORD' на имя вашей Wi-Fi сети (SSID) и пароль.
ssid = 'REPLACE_WITH_YOUR_SSID'
password = 'REPLACE_WITH_YOUR_PASSWORD'
Следующая функция connect_wifi() подключается к сети с SSID и паролем, которые вы передаёте при вызове функции.
# Connect to network
def connect_wifi(ssid, password):
# Connect to your network
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect(ssid, password)
# Wait for connection
timeout = 10
while not station.isconnected() and timeout > 0:
time.sleep(1)
timeout -= 1
if station.isconnected():
print('Connection successful')
print(station.ifconfig())
return True
else:
print('Connection failed. Timeout reached')
return False
Проверяем, подключены ли мы к интернету, прежде чем пытаться выполнить запрос:
if connect_wifi(ssid, password):
Если у нас есть успешное подключение к интернету, выполняем запрос. Используя модуль requests и метод get(), код отправляет GET-запрос на указанный URL. Ответ от сервера сохраняется в переменной response.
response = requests.get("https://gist.githubusercontent.com/RuiSantosdotme/9e834367f02c198bc6474938e4e3bb0d/raw/de66b26a95fc2d0b7620a43b49e57607bd4348e3/url.txt")
Ответ — это объект типа Response. Этот объект имеет несколько атрибутов, к которым вы можете получить доступ и которые могут быть полезны. Например:
response.status_code: возвращает целочисленное значение, представляющее статус ответа;response.content: возвращает фактическое содержимое в байтах;response.text: возвращает содержимое, преобразованное в строку, с использованием кодировки символов, такой как UTF-8;response.json(): возвращает ответ в виде JSON-объекта (словаря);response.headers(): доступ к информации о заголовках ответа.
После получения ответа мы получаем статус ответа с помощью атрибута status_code.
response_code = response.status_code
Мы сохраняем содержимое ответа в переменной response_content с помощью атрибута content.
response_content = response.content
Наконец, мы выводим код состояния и содержимое запроса в консоль Shell.
print('Response code: ', response_code)
print('Response content:', response_content)
Мы используем операторы try и except на случай, если во время запроса произойдёт ошибка:
except Exception as e:
print('An error occurred during the request:', str(e))
Тестирование кода
После ввода учётных данных сети вы можете запустить предыдущий код на ESP32 или ESP8266. Убедитесь, что Thonny IDE установила соединение с платой. Затем нажмите зелёную кнопку RUN.
Если всё пройдёт как ожидалось, код ответа должен быть 200, и на экране появится содержимое страницы GitHub — «RandomNerdTutorials.com».
Получение данных из интернета с помощью HTTP GET-запросов
Теперь, когда вы знаете, как выполнить базовый HTTP GET-запрос, мы покажем вам другой пример получения полезных данных из интернета. Мы запросим информацию о текущей погоде с помощью Weather API.
ESP32/ESP8266 Прогноз погоды (HTTP GET-запрос)
В этом примере мы будем использовать Weather API для создания прогноза погоды. Этот API бесплатен и предоставляет полезную информацию о погоде практически в любом месте мира.
Мы получим данные о погоде для вашего местоположения и отобразим их в консоли Shell.
Получение API-ключа
Перейдите на сайт Weather API: weatherapi.com
Зарегистрируйтесь для создания аккаунта или войдите, если аккаунт уже есть.
После подтверждения аккаунта войдите в систему.
На панели управления по адресу weatherapi.com/my/ вы найдёте свой API-ключ.
Скопируйте API-ключ в надёжное место, так как он понадобится позже.
Чтобы получить информацию о погоде в выбранном местоположении, введите следующий URL в веб-браузере, подставив своё местоположение и API-ключ в нужные места:
https://api.weatherapi.com/v1/current.json?q=YOUR_LOCATION+&key=YOUR_API_KEY
Например, в моём случае:
https://api.weatherapi.com/v1/current.json?q=Oporto+&key=d1578a064b07xxxc917164350240106
Скопируйте свой URL и вставьте его в браузер, и API вернёт информацию, соответствующую вашей местной погоде. Например:
{
"location": {
"name": "Oporto",
"region": "Porto",
"country": "Portugal",
"lat": 41.15,
"lon": -8.6167,
"tz_id": "Europe/Lisbon",
"localtime_epoch": 1762168698,
"localtime": "2025-11-03 11:18"
},
"current": {
"last_updated_epoch": 1762168500,
"last_updated": "2025-11-03 11:15",
"temp_c": 16.1,
"temp_f": 61,
"is_day": 1,
"condition": {
"text": "Partly Cloudy",
"icon": "//cdn.weatherapi.com/weather/64x64/day/116.png",
"code": 1003
},
"wind_mph": 4,
"wind_kph": 6.5,
"wind_degree": 142,
"wind_dir": "SE",
"pressure_mb": 1023,
"pressure_in": 30.21,
"precip_mm": 0,
"precip_in": 0,
"humidity": 68,
"cloud": 0,
"feelslike_c": 16.1,
"feelslike_f": 61,
"windchill_c": 14.8,
"windchill_f": 58.6,
"heatindex_c": 14.7,
"heatindex_f": 58.4,
"dewpoint_c": 7.5,
"dewpoint_f": 45.5,
"vis_km": 10,
"vis_miles": 6,
"uv": 2.3,
"gust_mph": 5.1,
"gust_kph": 8.2
}
}
Для получения дополнительной информации об API ознакомьтесь с документацией: Weather API Documentation.
Код — HTTP GET-запрос: Weather API (MicroPython)
Следующий код выполняет запрос к Weather API для получения данных о погоде в вашем местоположении. Затем мы отображаем данные в консоли Shell. Мы выведем информацию о текущей погоде, температуре, влажности и осадках.
# Rui Santos & Sara Santos - Random Nerd Tutorials
# Complete project details: https://RandomNerdTutorials.com/micropython-http-get-requests-esp32-esp8266/
import network
import time
import requests
# Wi-Fi credentials
ssid = 'REPLACE_WITH_YOUR_SSID'
password = 'REPLACE_WITH_YOUR_PASSWORD'
api_key = 'REPLACE_WITH_YOUR_API_KEY'
location ='REPLACE_WITH_YOUR_LOCATION'
# Request URL
url = f'https://api.weatherapi.com/v1/current.json?q={location}+&key={api_key}'
# Connect to network
def connect_wifi(ssid, password):
# Connect to your network
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect(ssid, password)
# Wait for connection
timeout = 10
while not station.isconnected() and timeout > 0:
time.sleep(1)
timeout -= 1
if station.isconnected():
print('Connection successful')
print(station.ifconfig())
return True
else:
print('Connection failed - timeout reached')
return False
if connect_wifi(ssid, password):
try:
# Make the request
response = requests.get(url)
#Print the response code
print('Response code: ', response.status_code)
# Get response content
weather = response.json()
# Close the request
response.close()
# Print bulk weather data
print('Weather JSON: ', weather)
# Get specific weather data
weather_description = weather['current']['condition']['text']
print('Current weather: ', weather_description)
# Temperature and humidity
temperature_c = weather['current']['temp_c']
temperature_f = weather['current']['temp_f']
humidity = weather['current']['humidity']
print(f'Temperature in Celsius: {temperature_c:.2f}')
print(f'Temperature in Fahrenheit: {temperature_f:.2f}')
print(f'Humidity (%): {humidity:.2f}')
# Precipitation
precipitation = weather['current']['precip_mm']
print(f'Precipitation in mm: {precipitation}')
# Wind
wind_speed = weather['current']['wind_kph']
print('Wind speed in kph:', wind_speed)
except Exception as e:
# Handle any exceptions during the request
print('Error during request:', e)
Как работает код
Сначала вам нужно ввести учётные данные сети для подключения платы к интернету.
# Wi-Fi credentials
ssid = 'REPLACE_WITH_YOUR_SSID'
password = 'REPLACE_WITH_YOUR_PASSWORD'
Затем введите ваш API-ключ Weather API и город, из которого хотите получить данные.
api_key = 'REPLACE_WITH_YOUR_API_KEY'
location = 'REPLACE_WITH_YOUR_CITY'
Например, в моём случае:
api_key = 'd1578a064b07xxxc917164350240106'
location ='Oporto'
Мы сохраняем URL запроса в переменной url. Это f-строка с заполнителями, чтобы URL обновлялся вашими данными во время выполнения.
url = f'https://api.weatherapi.com/v1/current.json?q={location}+&key={api_key}'
Затем мы подключаемся к интернету, вызывая функцию connect_wifi() (созданную ранее) и передавая SSID и пароль в качестве аргументов:
if connect_wifi(ssid, password):
Если мы успешно подключились к интернету, мы выполним запрос.
Как мы видели в предыдущем примере, выполнение запроса так же просто, как использование метода get() модуля requests и передача URL в качестве аргумента.
response = requests.get(url)
Это вернёт JSON-объект. Поэтому мы можем преобразовать результат в словарь Python с помощью метода json().
weather = response.json()
Затем мы закрываем соединение, чтобы освободить ресурсы.
# Close the request
response.close()
Теперь у нас есть все данные, которые вы видели в своём веб-браузере на предыдущих шагах, сохранённые в переменной weather.
Вы можете получить конкретную информацию, используя ключи нужных данных. Мы получаем описание погоды, температуру, влажность, осадки и скорость ветра. Вы также можете получить другие свойства, обращаясь к соответствующим ключам JSON-объекта.
# Get specific weather data
weather_description = weather['current']['condition']['text']
print('Current weather: ', weather_description)
# Temperature and humidity
temperature_c = weather['current']['temp_c']
temperature_f = weather['current']['temp_f']
humidity = weather['current']['humidity']
print(f'Temperature in Celsius: {temperature_c:.2f}')
print(f'Temperature in Fahrenheit: {temperature_f:.2f}')
print(f'Humidity (%): {humidity:.2f}')
# Precipitation
precipitation = weather['current']['precip_mm']
print(f'Precipitation in mm: {precipitation}')
# Wind
wind_speed = weather['current']['wind_kph']
print('Wind speed in kph:', wind_speed)
Тестирование кода
После ввода учётных данных сети, API-ключа и города вы можете запустить код на плате ESP32 или ESP8266.
Вы должны получить примерно то, что показано на скриншоте ниже, но с информацией для вашего выбранного местоположения.
Вот и всё. Вы успешно запросили данные с Weather API.
Заключение
В этом уроке вы узнали о HTTP GET-запросах с ESP32 и ESP8266, запрограммированных на MicroPython. Вы узнали, почему они полезны для IoT-проектов, и научились получать данные из интернета с помощью HTTP GET-запросов.
В качестве примера мы показали, как получить данные о погоде. Вы можете развить этот проект, отображая данные на дисплее, таком как LCD, OLED или TFT-дисплей. Вы можете создать цикл while или использовать прерывание по таймеру для периодического запроса данных, или даже запрашивать данные для нескольких местоположений, просто изменяя значение переменной location.
У нас есть несколько уроков, которые могут быть полезны:
Если вы хотите узнать больше о программировании плат ESP32 и ESP8266 с использованием MicroPython, ознакомьтесь с нашими ресурсами: