Как одним HTTP POST-запросом создать или обновить несколько разнотипных ресурсов

«Как одним HTTP POST-запросом создать или обновить несколько разнотипных ресурсов» — вопрос из категории Сети, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, POST — это наиболее гибкий и подходящий метод для выполнения пакетных (batch) операций, таких как создание или обновление нескольких ресурсов разных типов за один запрос.

Принцип работы: В теле POST-запроса передается структурированный документ (обычно JSON), содержащий массив или объект с данными для каждого ресурса. Сервер обрабатывает эту структуру и выполняет соответствующие операции.

Пример на FastAPI:

Серверная часть, принимающая данные о пользователе и продукте одновременно.

from fastapi import FastAPI
from pydantic import BaseModel
from typing import List

app = FastAPI()

class UserUpdate(BaseModel):
    id: int
    name: str

class ProductUpdate(BaseModel):
    sku: str
    stock: int

class BatchUpdateRequest(BaseModel):
    users: List[UserUpdate]
    products: List[ProductUpdate]

@app.post("/batch-update")
async def batch_update(data: BatchUpdateRequest):
    # Здесь логика обновления пользователей и продуктов в БД
    print(f"Updating {len(data.users)} users...")
    print(f"Updating {len(data.products)} products...")
    return {"status": "success", "updated_items": data.dict()}

Пример тела JSON-запроса:

{
  "users": [
    { "id": 1, "name": "Alice" },
    { "id": 2, "name": "Bob" }
  ],
  "products": [
    { "sku": "TSHIRT-RED-L", "stock": 99 }
  ]
}

Ключевые аспекты:

  • Гибкость: POST не привязан к семантике полного или частичного обновления и идеально подходит для сложных бизнес-операций.
  • Неидемпотентность: Повторная отправка POST-запроса может привести к созданию дубликатов или повторному выполнению операции. Это ожидаемое поведение.
  • URL: Запрос обычно отправляется на специальный эндпоинт, отражающий суть операции (например, /api/batch-update или /api/transactions).