You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2.6 KiB

JSON com bytes em Base64

Se sua aplicação precisa receber e enviar dados JSON, mas você precisa incluir dados binários nele, você pode codificá-los em base64.

Base64 vs Arquivos

Primeiro, considere se você pode usar Arquivos na request para fazer upload de dados binários e Response personalizada - FileResponse para enviar dados binários, em vez de codificá-los em JSON.

JSON só pode conter strings codificadas em UTF-8, portanto não pode conter bytes puros.

Base64 pode codificar dados binários em strings, mas, para isso, precisa usar mais caracteres do que os dados binários originais; assim, normalmente é menos eficiente do que arquivos comuns.

Use base64 apenas se realmente precisar incluir dados binários em JSON e não puder usar arquivos para isso.

Pydantic bytes

Você pode declarar um modelo Pydantic com campos bytes e então usar val_json_bytes na configuração do modelo para indicar que deve usar base64 para validar os dados JSON de entrada; como parte dessa validação, ele decodificará a string base64 em bytes.

{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:9,29:35] hl[9] *}

Se você verificar a /docs, verá que o campo data espera bytes codificados em base64:

Você poderia enviar uma request assim:

{
    "description": "Some data",
    "data": "aGVsbG8="
}

/// tip | Dica

aGVsbG8= é a codificação base64 de hello.

///

Em seguida, o Pydantic decodificará a string base64 e fornecerá os bytes originais no campo data do modelo.

Você receberá uma response assim:

{
  "description": "Some data",
  "content": "hello"
}

Pydantic bytes para dados de saída

Você também pode usar campos bytes com ser_json_bytes na configuração do modelo para dados de saída, e o Pydantic irá serializar os bytes como base64 ao gerar a response JSON.

{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,12:16,29,38:41] hl[16] *}

Pydantic bytes para dados de entrada e saída

E, claro, você pode usar o mesmo modelo configurado para usar base64 para lidar tanto com a entrada (validar) com val_json_bytes quanto com a saída (serializar) com ser_json_bytes ao receber e enviar dados JSON.

{* ../../docs_src/json_base64_bytes/tutorial001_py310.py ln[1:2,19:26,29,44:46] hl[23:26] *}