Code: Select all
### main.py
from typing import Annotated
from fastapi import FastAPI, Header
from pydantic import BaseModel, Field
app = FastAPI()
class CommonHeaders(BaseModel):
simpleheader: str
a_kebab_header: str | None = Field(
default=None,
title="a-kebab-header",
alias="a-kebab-header",
description="This is a header that should be specified as `a-kebab-header`",
)
@app.get("/")
def root_endpoint(
headers: Annotated[CommonHeaders, Header()],
):
result = {"headers received": headers}
return result
Und wenn ich es ausprobieren ", wird es so generieren, was ich als richtige Anfrage erwarten würde: < /p>
Code: Select all
curl -X 'GET' \
'http://localhost:8000/' \
-H 'accept: application/json' \
-H 'simpleheader: foo' \
-H 'a-kebab-header: bar'
< /code>
Aber in der Antwort wird deutlich, dass der Kebab-Case-Header nicht richtig empfangen wurde: < /p>
{
"headers received": {
"simpleheader": "foo",
"a-kebab-header": null
}
}
< /code>
Ändern des Headernamens in Snake_Case "a_kebab_header" in der Anforderung auch nicht. funktioniert auch wie erwartet. Die Swagger-Dokumente und das tatsächliche Verhalten sind inkonsistent.class CommonHeaders(BaseModel):
simpleheader: str
a_kebab_header: str | None = Field(
default=None,
description="This is a header that should be specified as `a-kebab-header`",
)
< /code>
Beachten Sie, dass dies jetzt zu den Swagger -Dokumenten führt, die es in Snake_Case angeben: < /p>
und mit "Probieren Sie es aus" in der Snake_Case -Variante:
. curl -X 'GET' \
'http://localhost:8000/' \
-H 'accept: application/json' \
-H 'simpleheader: foo' \
-H 'a_kebab_header: bar'
< /code>
Aber überraschenderweise funktioniert das nicht! Die Antwort: < /p>
{
"headers received": {
"simpleheader": "foo",
"a_kebab_header": null
}
}
< /code>
Aber in einem überraschenden Ende, wenn ich die Anforderung in Kebab-Case manuell neu schreibe: < /p>
curl -X 'GET' \
'http://localhost:8000/' \
-H 'accept: application/json' \
-H 'simpleheader: foo' \
-H 'a-kebab-header: bar'
< /code>
Es nimmt schließlich diesen Header-Wert über die magische Übersetzung auf und ich erhalte die gewünschten Ergebnisse zurück: < /p>
{"headers received":{"simpleheader":"foo","a_kebab_header":"bar"}}
Code: Select all
"""Alternative version without Pydantic."""
from typing import Annotated
from fastapi import FastAPI, Header
app = FastAPI()
@app.get("/")
def root_endpoint(
simpleheader: Annotated[str, Header()],
a_kebab_header: Annotated[
str | None,
Header(
title="a-kebab-header",
description="This is a header that should be specified as `a-kebab-header`",
),
] = None,
):
result = {
"headers received": {
"simpleheader": simpleheader,
"a_kebab_header": a_kebab_header,
}
}
return result