MicroPython: HTTP GET-запросы с ESP32/ESP8266

Узнайте, как выполнять HTTP GET-запросы с помощью плат ESP32 или ESP8266, запрограммированных на MicroPython. Сначала мы рассмотрим основы HTTP GET-запросов, а затем создадим и разберём два разных примера с использованием библиотеки requests.

MicroPython ESP32 ESP8266 HTTP GET-запросы — начало работы

HTTP-запросы необходимы для взаимодействия с веб-сервисами, получения данных из внешних источников, интеграции с веб-API для доступа к сторонним сервисам и многого другого, как вы увидите в этом уроке.

Этот урок совместим с платами ESP32 и ESP8266.

Содержание

В этом уроке мы рассмотрим следующие темы:

Предварительные требования — прошивка MicroPython

Для прохождения этого урока вам необходима прошивка MicroPython, установленная на ваших платах ESP32 или ESP8266. Также вам нужна IDE для написания и загрузки кода на плату. Мы рекомендуем использовать Thonny IDE:

Впервые работаете с MicroPython? Ознакомьтесь с нашим курсом: Начало работы с MicroPython на ESP32 и ESP8266

Что такое HTTP-запросы?

Наиболее распространённый способ обмена данными с другим компьютером (сервером) в интернете — использование протокола HTTP.

HTTP (Hypertext Transfer Protocol) работает по модели клиент-сервер. В этой модели клиент взаимодействует с сервером с помощью HTTP-запросов. HTTP-запрос — это сообщение, отправляемое клиентом серверу, обычно для запроса определённого действия или получения информации. Сервер отправляет ответ обратно клиенту также через HTTP.

HTTP-запрос ESP32
  • Клиент: инициирует обмен данными через запрос.

  • Сервер: получает и обрабатывает запрос и отправляет ответ обратно.

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.

Зелёная кнопка RUN в Thonny IDE

Если всё пройдёт как ожидалось, код ответа должен быть 200, и на экране появится содержимое страницы GitHub — «RandomNerdTutorials.com».

Результат HTTP GET-запроса с ESP32 в консоли Thonny IDE

Получение данных из интернета с помощью HTTP GET-запросов

Теперь, когда вы знаете, как выполнить базовый HTTP GET-запрос, мы покажем вам другой пример получения полезных данных из интернета. Мы запросим информацию о текущей погоде с помощью Weather API.

ESP32/ESP8266 Прогноз погоды (HTTP GET-запрос)

В этом примере мы будем использовать Weather API для создания прогноза погоды. Этот API бесплатен и предоставляет полезную информацию о погоде практически в любом месте мира.

Пример прогноза погоды

Мы получим данные о погоде для вашего местоположения и отобразим их в консоли Shell.

Получение API-ключа

  1. Перейдите на сайт Weather API: weatherapi.com

  2. Зарегистрируйтесь для создания аккаунта или войдите, если аккаунт уже есть.

  3. После подтверждения аккаунта войдите в систему.

  4. На панели управления по адресу weatherapi.com/my/ вы найдёте свой API-ключ.

API-ключ Weather 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.

Вы должны получить примерно то, что показано на скриншоте ниже, но с информацией для вашего выбранного местоположения.

ESP32 получение данных о погоде через Weather API — MicroPython Thonny IDE

Вот и всё. Вы успешно запросили данные с Weather API.

Заключение

В этом уроке вы узнали о HTTP GET-запросах с ESP32 и ESP8266, запрограммированных на MicroPython. Вы узнали, почему они полезны для IoT-проектов, и научились получать данные из интернета с помощью HTTP GET-запросов.

В качестве примера мы показали, как получить данные о погоде. Вы можете развить этот проект, отображая данные на дисплее, таком как LCD, OLED или TFT-дисплей. Вы можете создать цикл while или использовать прерывание по таймеру для периодического запроса данных, или даже запрашивать данные для нескольких местоположений, просто изменяя значение переменной location.

У нас есть несколько уроков, которые могут быть полезны:

Если вы хотите узнать больше о программировании плат ESP32 и ESP8266 с использованием MicroPython, ознакомьтесь с нашими ресурсами: