Вот минимальное воспроизведение проблемы : < /p>
Код: Выделить всё
### 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
И если я «попробую», это будет генерировать то, что я ожидаю в качестве правильного запроса: < /p>
Код: Выделить всё
curl -X 'GET' \
'http://localhost:8000/' \
-H 'accept: application/json' \
-H 'simpleheader: foo' \
-H 'a-kebab-header: bar'
< /code>
Но в ответе становится ясно, что он неправильно получил заголовок кебаба: < /p>
{
"headers received": {
"simpleheader": "foo",
"a-kebab-header": null
}
}
< /code>
Изменение имени заголовка на snake_case "a_kebab_header" в запросе тоже не работает. T Работайте либо (хотя я бы ожидал, что это будет из-за преобразования «волшебного шашлыка», описанного в документах Fastapi). < /p>
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>
, хотя теперь это приводит к тому, что документы Swagger, указанные в Snake_case: < /p>
и использование "Попробуйте это" приводит к варианту snake_case:
curl -X 'GET' \
'http://localhost:8000/' \
-H 'accept: application/json' \
-H 'simpleheader: foo' \
-H 'a_kebab_header: bar'
< /code>
Но, как ни странно, это тоже не работает! Ответ: < /p>
{
"headers received": {
"simpleheader": "foo",
"a_kebab_header": null
}
}
< /code>
Но в неожиданном окончании, если я вручную переписываю запрос в Kebab-case: < /p>
curl -X 'GET' \
'http://localhost:8000/' \
-H 'accept: application/json' \
-H 'simpleheader: foo' \
-H 'a-kebab-header: bar'
< /code>
, наконец, поднимает это значение заголовка с помощью волшебного перевода, и я получаю нужные результаты обратно: < /p>
{"headers received":{"simpleheader":"foo","a_kebab_header":"bar"}}
Подробнее здесь: https://stackoverflow.com/questions/794 ... der-fields