Отправить и разобрать XML#

Установите отдельный плагин:

uv add "eazy-sdk-core[xml]"

Один ElementTreeXmlCodec сериализует модель запроса и разбирает примитивы ответа:

# examples/docs/integration_xml_document.py
codec = ElementTreeXmlCodec(root_name="order")


@dataclass(frozen=True, slots=True)
class Order:
    id: int


@dataclass(frozen=True, slots=True)
class OrderResult:
    id: int


@dataclass(frozen=True, slots=True, kw_only=True)
class CreateOrder(HttpOperation[OrderResult]):
    __http__ = Http.post(
        "/orders",
        success={201: Extracted(OrderResult, using=XmlResponse(codec))},
    )
    order: Annotated[Order, XmlBody(codec)]


class OrdersApi(SyncApi):
    create = op(CreateOrder)
Файл целиком
"""Send and receive XML through the XML body codec."""

from __future__ import annotations

from dataclasses import dataclass
from typing import Annotated

from eazy_sdk_xml import ElementTreeXmlCodec, XmlBody, XmlResponse

from eazy_sdk import Http, HttpOperation, SyncApi, op
from eazy_sdk.response import Extracted

from .guide_site import GuideSite, guide_client


# docs:integration-xml-document:start
# examples/docs/integration_xml_document.py
codec = ElementTreeXmlCodec(root_name="order")


@dataclass(frozen=True, slots=True)
class Order:
    id: int


@dataclass(frozen=True, slots=True)
class OrderResult:
    id: int


@dataclass(frozen=True, slots=True, kw_only=True)
class CreateOrder(HttpOperation[OrderResult]):
    __http__ = Http.post(
        "/orders",
        success={201: Extracted(OrderResult, using=XmlResponse(codec))},
    )
    order: Annotated[Order, XmlBody(codec)]


class OrdersApi(SyncApi):
    create = op(CreateOrder)
# docs:integration-xml-document:end


def main() -> None:
    with guide_client(GuideSite()) as client:
        result = OrdersApi(client).create(order=Order(id=42))
    print(f"xml order: {result.id}")


if __name__ == "__main__":
    main()
xml order: 42

XmlBody задаёт Content-Type: application/xml и кодирует тело. XmlResponse читает XML в примитивное дерево, после чего общий реестр моделей создаёт OrderResult. Ошибка синтаксиса XML становится ошибкой разбора ответа.

Для извлечения отдельных полей из XML-документа используйте ElementTreeBackend и XPath. Этот бэкенд не поддерживает CSS; несовместимый селектор отвергается при компиляции операции.

Дальше#