You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

7.4 KiB

Тіло запиту - Декілька параметрів

Тепер, коли ми розглянули використання Path та Query, розгляньмо більш просунуті способи оголошення тіла запиту в FastAPI.

Змішування Path, Query та параметрів тіла запиту

По-перше, звісно, Ви можете вільно змішувати оголошення параметрів Path, Query та тіла запиту, і FastAPI правильно їх обробить.

Також Ви можете оголосити параметри тіла як необов’язкові, встановивши для них значення за замовчуванням None:

{* ../../docs_src/body_multiple_params/tutorial001_an_py310.py hl[18:20] *}

/// note | Примітка

Зверніть увагу, що в цьому випадку параметр item, який береться з тіла запиту, є необов'язковим, оскільки має значення за замовчуванням None.

///

Декілька параметрів тіла запиту

У попередньому прикладі операція шляху очікувала JSON з атрибутами Item, наприклад:

{
    "name": "Foo",
    "description": "The pretender",
    "price": 42.0,
    "tax": 3.2
}

Але Ви також можете оголосити декілька параметрів тіла, наприклад item та user:

{* ../../docs_src/body_multiple_params/tutorial002_py310.py hl[20] *}

У цьому випадку FastAPI розпізнає, що є кілька параметрів тіла (два параметри є моделями Pydantic).

Тому він використає назви параметрів як ключі (назви полів) у тілі запиту, очікуючи:

{
    "item": {
        "name": "Foo",
        "description": "The pretender",
        "price": 42.0,
        "tax": 3.2
    },
    "user": {
        "username": "dave",
        "full_name": "Dave Grohl"
    }
}

/// note | Примітка

Зверніть увагу, що хоча item оголошено, так само як і раніше, тепер він очікується в тілі під ключем item.

///

FastAPI автоматично конвертує дані із запиту таким чином, щоб параметр item отримав свій вміст, і те ж саме стосується user.

Він виконає валідацію складених даних і задокументує їх відповідним чином у схемі OpenAPI та в автоматичній документації.

Одиничні значення в тілі запиту

Так само як є Query і Path для визначення додаткових даних для параметрів запиту та шляху, FastAPI надає еквівалентний Body.

Наприклад, розширюючи попередню модель, Ви можете вирішити додати ще один ключ importance в те ж саме тіло запиту разом із item і user.

Якщо Ви оголосите його як є, то, оскільки це одиничне значення, FastAPI припускатиме, що це параметр запиту (query parameter).

Але Ви можете вказати FastAPI обробляти його як інший ключ тіла (body key), використовуючи Body:

{* ../../docs_src/body_multiple_params/tutorial003_an_py310.py hl[23] *}

У цьому випадку FastAPI очікуватиме тіло запиту у такому вигляді:

{
    "item": {
        "name": "Foo",
        "description": "The pretender",
        "price": 42.0,
        "tax": 3.2
    },
    "user": {
        "username": "dave",
        "full_name": "Dave Grohl"
    },
    "importance": 5
}

Знову ж таки, FastAPI конвертуватиме типи даних, перевірятиме їх, створюватиме документацію тощо.

Декілька body та query параметрів

Звісно, Ви можете оголошувати додаткові query параметри запиту, коли це необхідно, на додаток до будь-яких параметрів тіла запиту.

Оскільки за замовчуванням окремі значення інтерпретуються як параметри запиту, Вам не потрібно явно додавати Query, можна просто використати:

q: Union[str, None] = None

Або в Python 3.10 та вище:

q: str | None = None

Наприклад:

{* ../../docs_src/body_multiple_params/tutorial004_an_py310.py hl[28] *}

/// info | Інформація

Body також має ті самі додаткові параметри валідації та метаданих, що й Query, Path та інші, які Ви побачите пізніше.

///

Вкладений поодинокий параметр тіла запиту

Припустимо, у вас є лише один параметр тіла запиту item з моделі Pydantic Item.

За замовчуванням FastAPI очікуватиме, що тіло запиту міститиме вміст безпосередньо.

Але якщо Ви хочете, щоб він очікував JSON з ключем item, а всередині — вміст моделі (так, як це відбувається при оголошенні додаткових параметрів тіла), Ви можете використати спеціальний параметр Bodyembed:

item: Item = Body(embed=True)

як у прикладі:

{* ../../docs_src/body_multiple_params/tutorial005_an_py310.py hl[17] *}

У цьому випадку FastAPI очікуватиме тіло запиту такого вигляду:

{
    "item": {
        "name": "Foo",
        "description": "The pretender",
        "price": 42.0,
        "tax": 3.2
    }
}

замість:

{
    "name": "Foo",
    "description": "The pretender",
    "price": 42.0,
    "tax": 3.2
}

Підсумок

Ви можете додавати кілька параметрів тіла до Вашої функції операції шляху (path operation function), навіть якщо запит може мати лише одне тіло.

Але FastAPI обробить це, надасть Вам потрібні дані у функції, перевірить їх та задокументує коректну схему в операції шляху.

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

Крім того, Ви можете вказати FastAPI вбудовувати тіло в ключ, навіть якщо оголошено лише один параметр.