HTTP-запросы через urequests: общаемся с сервером

Учим плату отправлять данные в облако и получать ответы из интернета.

urequests — облегчённая версия библиотеки requests для MicroPython, позволяющая делать HTTP-запросы (GET, POST) к веб-серверам.

GET: получаем данные

Запрос GET читает данные с сервера — например, прогноз погоды или точное время:

import urequests

response = urequests.get("http://worldtimeapi.org/api/timezone/Europe/Moscow")
data = response.json()       # разбираем JSON в словарь
print("Время:", data["datetime"])
response.close()             # обязательно закрываем!

POST: отправляем показания

Запрос POST шлёт данные на сервер — например, температуру в облачный сервис:

import urequests
import ujson

payload = {"temperature": 23.5, "humidity": 45}
headers = {"Content-Type": "application/json"}

response = urequests.post(
    "http://example.com/api/sensor",
    data=ujson.dumps(payload),
    headers=headers,
)
print("Код ответа:", response.status_code)
response.close()

Разбор JSON — на чистом Python

Парсинг и формирование JSON-конфига — это чистая стандартная библиотека, поэтому пример запускается в браузере:

import json

# формируем тело запроса
payload = {"device": "esp32-livingroom", "temperature": 23.5, "humidity": 45}
body = json.dumps(payload)
print("Отправляем:", body)

# разбираем ответ сервера
server_reply = '{"status": "ok", "saved": true, "id": 42}'
reply = json.loads(server_reply)
print("Статус:", reply["status"], "| id записи:", reply["id"])

Вывод:

Отправляем: {"device": "esp32-livingroom", "temperature": 23.5, "humidity": 45}
Статус: ok | id записи: 42

Коды ответа

КодЗначение
200Успех
201Создано (часто после POST)
400Ошибка в запросе
404Адрес не найден
500Ошибка на сервере

Как работает под капотом

HTTP-запрос — это текст, который плата отправляет серверу через TCP-соединение (используя Wi-Fi-стек). urequests открывает сокет на нужный порт (80 для http), формирует строку запроса с заголовками и телом, ждёт ответ и парсит его. Каждый ответ занимает память под буфер, поэтому критично вызывать response.close() — иначе при многих запросах память кончится и плата перезагрузится.

Частые ошибки

  • Забыть response.close(). Утечка памяти — самая частая причина «непонятных» перезагрузок.
  • HTTPS на слабой плате. Шифрование TLS требует много памяти; иногда приходится использовать http или плату с PSRAM.
  • Не проверять status_code. Считать ответ успешным, не убедившись, что код 200.

Итог

  • urequests делает HTTP-запросы: GET — читать, POST — отправлять.
  • JSON формируют через json.dumps и разбирают json.loads.
  • Всегда вызывайте response.close(), чтобы не утекала память.
  • Проверяйте status_code; HTTPS на ESP32 тяжёл по памяти.
Проверьте себя
1. Какой HTTP-метод обычно используют, чтобы ОТПРАВИТЬ показания датчика на сервер?
AGET
BPOST
CDELETE
DHEAD
2. Почему важно вызывать response.close()?
AЭто требование синтаксиса
BИначе утекает память, и плата может перезагрузиться
CЧтобы ускорить Wi-Fi
DЭто закрывает программу
3. Что означает код ответа 200?
AОшибка сервера
BАдрес не найден
CУспех
DЗапрос запрещён