Отправить готовые байты#
Используйте BytesBody, когда приложение уже создало окончательные байты. SDK не применяет к
ним JSON, form или multipart-кодирование.
→ Request · PUT /objects/report.bin
Content-Type: application/octet-stream
mail
← Response · 201 Created
{"stored": true, "bytes": 4}
# examples/docs/request_bytes.py
@dataclass(frozen=True, slots=True, kw_only=True)
class PutObject(HttpOperation[Upload]):
__http__ = Http.put("/objects/{name}", success={201: Upload})
name: Path[str]
payload: Annotated[
bytes,
markers.BytesBody(content_type="application/octet-stream"),
]
class ObjectsApi(SyncApi):
put = op(PutObject)
payload передаёт четыре байта без преобразования. content_type задаёт заголовок тела. Для
gzip или deflate укажите content_encoding: сжатие завершится до вычисления подписи.
Файл примера целиком
"""Send an already encoded byte string as the request body."""
from __future__ import annotations
from dataclasses import dataclass
from typing import Annotated
from eazy_sdk import Http, HttpOperation, Path, SyncApi, op
from eazy_sdk.request import markers
from examples.docs.request_site import request_client
@dataclass(frozen=True, slots=True)
class Upload:
stored: bool
bytes: int
# docs:example:start
# examples/docs/request_bytes.py
@dataclass(frozen=True, slots=True, kw_only=True)
class PutObject(HttpOperation[Upload]):
__http__ = Http.put("/objects/{name}", success={201: Upload})
name: Path[str]
payload: Annotated[
bytes,
markers.BytesBody(content_type="application/octet-stream"),
]
class ObjectsApi(SyncApi):
put = op(PutObject)
# docs:example:end
def main() -> None:
with request_client() as client:
upload = ObjectsApi(client).put(name="report.bin", payload=b"mail")
print(f"stored: {upload.stored}; bytes: {upload.bytes}")
if __name__ == "__main__":
main()
Запуск: uv run python examples/docs/request_bytes.py.
stored: True; bytes: 4
Для потока, который можно отправить повторно, используйте ReplayableStreamBody. Обычный
одноразовый поток нельзя безопасно повторить после ошибки транспорта.