Заголовки
Заголовки — это пары ключ-значение, отправляемые вместе с HTTP-запросом. Они несут метаданные о запросе — такие как тип контента, токены авторизации, информацию о клиенте и многое другое. Заголовки не являются частью URL или тела, но отправляются в отдельной секции между строкой запроса и телом.
Как выглядят параметры заголовков?
Вот как может выглядеть запрос с заголовками:
GET /profile HTTP/1.1
Host: example.com
User-Agent: curl/8.5.0
Accept: application/json, text/plain, text/html
Каждый заголовок структурирован как пара ключ-значение, и согласно спецификации HTTP (RFC 7230), ключ заголовка может появляться несколько раз с различными значениями. Когда это происходит, значения либо:
- отправляются как отдельные строки заголовков с тем же ключом
- объединяются в единое значение, разделенное запятыми.
Параметры заголовков vs другие параметры запроса
-
Расположение в запросе Параметры заголовков являются частью HTTP-заголовков, отправляемых отдельно от URL и тела. Например:
GET /resource HTTP/1.1
Host: example.com
Authorization: Bearer abc123
X-Custom-Header: value -
Формат кодирования Заголовки — это пары ключ-значение в виде обычного текста. В отличие от параметров запроса, они не кодируются URL, но значения должны соответствовать стандартам HTTP-заголовков.
-
Типы данных Заголовки обычно несут строки, но могут быть разобраны в примитивные типы, такие как int, bool, или пользовательские типы по необходимости.
-
Случаи использования Заголовки обычно используются для метаданных, таких как токены аутентификации, тип контента, информация о пользовательском агенте или пользовательские флаги управления. Они не предназначены для несения больших или сложных структур данных, как параметры тела.
Объявление параметров заголовков в lihil
Вы можете легко объявлять параметры заголовков непосредственно в вашей конечной точке, используя Param("header")
.
from lihil import Route, Param
from typing import Annotated
route = Route("/greet")
@route.get
async def greet_user(
user_agent: Annotated[str, Param("header")], # Автоматически сопоставляется с "user-agent"
accept: Annotated[list[str], Param("header")], # Обрабатывает разделенный запятыми Accept
):
return {"ua": user_agent, "accepts": accept}
Заголовки с множественными значениями
Некоторые заголовки — такие как Accept
, Accept-Language
, Cache-Control
естественно поддерживают множественные значения, разделенные запятыми.
lihil поддерживает это из коробки. Чтобы принять заголовок с множественными значениями, просто используйте аннотацию типа list[str]:
Чтобы принять заголовок с множественными значениями, просто используйте аннотацию типа list[str]:
accept: Annotated[list[str], Param("header")]
Это правильно разберет:
Accept: text/html, application/json
в:
["text/html", "application/json"]
Сопоставление ключей заголовков
Имена HTTP-заголовков часто используют kebab-case (например, X-Request-ID), но переменные Python не могут содержать тире. lihil решает это двумя способами:
Автоматическое сопоставление: По умолчанию lihil преобразует my_token
в my-token
.
Явное псевдонимирование: Вы можете использовать опцию alias для указания точного ключа заголовка:
request_id: Annotated[str, Param("header", alias="x-request-id")]
Пользовательский декодер
для более сложных заголовков вы можете определить функцию пользовательского декодера. Эта функция принимает сырое значение заголовка и возвращает желаемый тип.
from lihil import Route, Param
from typing import Annotated
def custom_decoder(value: str) -> str:
# Пользовательская логика декодирования
return value.lower()
route = Route("/greet")
@route
async def create_user(
user_agent: Annotated[str, Param("header")],
custom_header: Annotated[str, Param("header", decoder=custom_decoder)],
):
return {"ua": user_agent, "custom": custom_header}
Резюме
- Параметры заголовков являются частью HTTP-заголовков, несущих метаданные, такие как токены аутентификации или пользовательские флаги.
- Это пары ключ-значение в виде обычного текста, не кодированные URL.
- В lihil объявляйте заголовки явно, используя Annotated с Param(alias=...) для точных имен заголовков.
- lihil автоматически обрабатывает конвертацию типов, валидацию и значения по умолчанию.
- Отсутствующие или недействительные заголовки приводят к автоматическим ответам об ошибках для надежной обработки ввода.