コンテンツへスキップ

ヘッダーパラメーター

QueryPathCookieパラメーターと同じ方法でヘッダーパラメーターを定義できます。

Headerのインポート

最初にHeaderをインポートします

from typing import Annotated

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(user_agent: Annotated[str | None, Header()] = None):
    return {"User-Agent": user_agent}
from typing import Annotated, Union

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(user_agent: Annotated[Union[str, None], Header()] = None):
    return {"User-Agent": user_agent}
from typing import Union

from fastapi import FastAPI, Header
from typing_extensions import Annotated

app = FastAPI()


@app.get("/items/")
async def read_items(user_agent: Annotated[Union[str, None], Header()] = None):
    return {"User-Agent": user_agent}

ヒント

可能であれば、Annotatedバージョンを使用することをお勧めします。

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(user_agent: str | None = Header(default=None)):
    return {"User-Agent": user_agent}

ヒント

可能であれば、Annotatedバージョンを使用することをお勧めします。

from typing import Union

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(user_agent: Union[str, None] = Header(default=None)):
    return {"User-Agent": user_agent}

Headerパラメーターの宣言

次に、PathQueryCookieと同じ構造を使用してヘッダーパラメーターを宣言します。

デフォルト値と、すべての追加の検証またはアノテーションパラメーターを定義できます。

from typing import Annotated

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(user_agent: Annotated[str | None, Header()] = None):
    return {"User-Agent": user_agent}
from typing import Annotated, Union

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(user_agent: Annotated[Union[str, None], Header()] = None):
    return {"User-Agent": user_agent}
from typing import Union

from fastapi import FastAPI, Header
from typing_extensions import Annotated

app = FastAPI()


@app.get("/items/")
async def read_items(user_agent: Annotated[Union[str, None], Header()] = None):
    return {"User-Agent": user_agent}

ヒント

可能であれば、Annotatedバージョンを使用することをお勧めします。

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(user_agent: str | None = Header(default=None)):
    return {"User-Agent": user_agent}

ヒント

可能であれば、Annotatedバージョンを使用することをお勧めします。

from typing import Union

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(user_agent: Union[str, None] = Header(default=None)):
    return {"User-Agent": user_agent}

「技術的な詳細」

Headerは、PathQueryCookieの「姉妹」クラスです。また、同じ共通のParamクラスを継承しています。

しかし、QueryPathHeaderなどをfastapiからインポートすると、それらは実際には特別なクラスを返す関数であることを忘れないでください。

情報

ヘッダーを宣言するには、Headerを使用する必要があります。そうでない場合、パラメーターはクエリパラメーターとして解釈されます。

自動変換

Headerは、PathQueryCookieが提供するものに加えて、少し追加の機能を持っています。

ほとんどの標準ヘッダーは、「ハイフン」文字(「マイナス記号」とも呼ばれる)(-)で区切られています。

しかし、user-agentのような変数はPythonでは無効です。

そのため、デフォルトでは、Headerはパラメーター名の文字をアンダースコア(_)からハイフン(-)に変換して、ヘッダーを抽出および文書化します。

また、HTTPヘッダーは大文字と小文字を区別しないため、標準的なPythonスタイル(「snake_case」とも呼ばれます)で宣言できます。

そのため、User_Agentなどにする必要がなく、Pythonコードで通常どおりuser_agentを使用できます。

何らかの理由で、アンダースコアをハイフンに自動変換する機能を無効にする必要がある場合は、Headerconvert_underscoresパラメーターをFalseに設定します。

from typing import Annotated

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(
    strange_header: Annotated[str | None, Header(convert_underscores=False)] = None,
):
    return {"strange_header": strange_header}
from typing import Annotated, Union

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(
    strange_header: Annotated[
        Union[str, None], Header(convert_underscores=False)
    ] = None,
):
    return {"strange_header": strange_header}
from typing import Union

from fastapi import FastAPI, Header
from typing_extensions import Annotated

app = FastAPI()


@app.get("/items/")
async def read_items(
    strange_header: Annotated[
        Union[str, None], Header(convert_underscores=False)
    ] = None,
):
    return {"strange_header": strange_header}

ヒント

可能であれば、Annotatedバージョンを使用することをお勧めします。

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(
    strange_header: str | None = Header(default=None, convert_underscores=False),
):
    return {"strange_header": strange_header}

ヒント

可能であれば、Annotatedバージョンを使用することをお勧めします。

from typing import Union

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(
    strange_header: Union[str, None] = Header(default=None, convert_underscores=False),
):
    return {"strange_header": strange_header}

警告

convert_underscoresFalseに設定する前に、一部のHTTPプロキシとサーバーでは、アンダースコアを含むヘッダーの使用が許可されていないことを考慮してください。

重複するヘッダー

重複するヘッダーを受け取る可能性があります。つまり、同じヘッダーに複数の値があるということです。

型宣言でリストを使用して、これらのケースを定義できます。

重複するヘッダーからのすべての値は、Pythonのlistとして受け取られます。

たとえば、複数回出現する可能性のあるX-Tokenヘッダーを宣言するには、次のように記述します。

from typing import Annotated

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(x_token: Annotated[list[str] | None, Header()] = None):
    return {"X-Token values": x_token}
from typing import Annotated, List, Union

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(x_token: Annotated[Union[List[str], None], Header()] = None):
    return {"X-Token values": x_token}
from typing import List, Union

from fastapi import FastAPI, Header
from typing_extensions import Annotated

app = FastAPI()


@app.get("/items/")
async def read_items(x_token: Annotated[Union[List[str], None], Header()] = None):
    return {"X-Token values": x_token}

ヒント

可能であれば、Annotatedバージョンを使用することをお勧めします。

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(x_token: list[str] | None = Header(default=None)):
    return {"X-Token values": x_token}

ヒント

可能であれば、Annotatedバージョンを使用することをお勧めします。

from typing import Union

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(x_token: Union[list[str], None] = Header(default=None)):
    return {"X-Token values": x_token}

ヒント

可能であれば、Annotatedバージョンを使用することをお勧めします。

from typing import List, Union

from fastapi import FastAPI, Header

app = FastAPI()


@app.get("/items/")
async def read_items(x_token: Union[List[str], None] = Header(default=None)):
    return {"X-Token values": x_token}

次の様な2つのHTTPヘッダーを送信して、そのパスオペレーションと通信する場合

X-Token: foo
X-Token: bar

レスポンスは次のようになります。

{
    "X-Token values": [
        "bar",
        "foo"
    ]
}

まとめ

QueryPathCookieと同様の一般的なパターンを使用して、Headerでヘッダーを宣言します。

変数内のアンダースコアについては心配する必要はありません。**FastAPI**が変換を処理します。