</>
Тема 4 из 6

Отправка данных

До сих пор программа только спрашивала. Теперь научимся отправлять: создавать записи, отправлять формы, менять и удалять данные на сервере.

Методы HTTP

Метод Зачем requests
GET получить requests.get
POST создать запись, отправить форму requests.post
PUT заменить запись целиком requests.put
PATCH изменить часть полей requests.patch
DELETE удалить requests.delete

В REST API адрес обозначает ресурс, а метод — действие: POST /tasks создаёт задачу, PATCH /tasks/7 меняет седьмую, DELETE /tasks/7 удаляет её.

JSON: json=

r = requests.post(
    "https://api.site.ru/tasks",
    json={"title": "Купить хлеб", "done": False},
    timeout=5,
)
print(r.status_code)      # 201 Created
print(r.json()["id"])     # номер новой записи

json= сам превращает словарь в JSON (False → false, None → null) и ставит заголовок Content-Type: application/json. Не собирайте JSON вручную строкой: первая же кавычка в названии сломает его.

Обратите внимание на код 201 Created: при создании успех — это не обязательно 200. Надёжнее проверять r.ok или конкретный код, который обещает документация API.

Формы: data=

HTML-форма отправляет поля в другом формате — application/x-www-form-urlencoded. Для него служит data=:

r = requests.post("https://site.ru/feedback", data={"name": "Аня", "rating": 5}, timeout=5)

Если перепутать json= и data=, сервер ответит 415 Unsupported Media Type или 400.

После успешной отправки формы сайт обычно отвечает перенаправлением 303 на страницу «Спасибо». requests сам переходит по нему запросом GET, и в r.text оказывается уже итоговая страница. Цепочку переходов видно в r.history, а отключить переходы можно параметром allow_redirects=False.

Изменение и удаление

requests.patch(f"{base}/tasks/7", json={"done": True}, timeout=5)   # одно поле
requests.put(f"{base}/tasks/7", json={"title": "Хлеб", "done": True}, timeout=5)  # всё целиком
r = requests.delete(f"{base}/tasks/7", timeout=5)
print(r.status_code)   # 204 No Content — удалено, тела нет

Синхронизация

Частая задача — привести данные на сервере к тем, что у вас. Чтобы не делать лишних запросов:

  1. скачайте список с сервера и разложите по ключу ({title: task});
  2. для каждой своей записи: нет на сервере → POST; есть, но отличается → PATCH; совпадает → ничего;
  3. записи сервера, которых нет у вас, → DELETE.

Итог

  • post, put, patch, delete — как get, но с телом;
  • json= для API, data= для форм; JSON вручную не собираем;
  • 201 Created, 204 No Content — тоже успех;
  • после формы бывает 303 → requests сам идёт на итоговую страницу.