Skip to main content

Exemplos de código

Esta página mostra como enviar o conteúdo JSON para o Azure Blob Storage. Os exemplos não geram o JSON: o método recebe o prefixo da interface e o conteúdo como string, cria o nome do arquivo com um timestamp UTC e publica o blob.

Pré-requisitos

Tenha em mãos:

  • uma URL SAS completa, disponibilizada pela WeRetail, com escopo no container, permissões c (create) e w (write), e prazo de expiração definido;
  • o prefixo correspondente à interface, conforme a estrutura dos arquivos.

A URL SAS deve ser usada somente durante o período de validade configurado e não deve ser gravada no código-fonte. Armazene-a em uma variável de ambiente ou em um gerenciador de segredos.

Prefixos

InterfacePrefixo
LojasLOJAS-
VendedoresVENDEDORES-
ClientesCLIENTES-
ProdutosPRODUTOS-
EstoqueESTOQUE_PRODUTOS-
MovimentaçõesMOVIMENTACAO-
PedidosPEDIDO_VENDAS-

Nos exemplos, o sufixo do arquivo usa o timestamp UTC no formato yyyyMMddHHmmssfff (ano, mês, dia, hora, minuto, segundo e milissegundos). Assim, os nomes ficam ordenados cronologicamente e a chance de colisão é reduzida.

C# (.NET)

Instale o pacote:

dotnet add package Azure.Storage.Blobs
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
public sealed class WeRetailBlobUploader
{
private readonly BlobContainerClient container;

public WeRetailBlobUploader()
{
var sasUrl = Environment.GetEnvironmentVariable("AZURE_BLOB_SAS_URL")
?? throw new InvalidOperationException("AZURE_BLOB_SAS_URL não configurada.");

container = new BlobContainerClient(new Uri(sasUrl));
}

public async Task<string> EnviarJsonAsync(string prefixo, string content)
{
var timestamp = DateTime.UtcNow.ToString("yyyyMMddHHmmssfff");
var fileName = $"{prefixo}{timestamp}.json";
var blob = container.GetBlobClient(fileName);

using var stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(content));
await blob.UploadAsync(stream, new BlobHttpHeaders { ContentType = "application/json" });
return fileName;
}
}

Exemplo de chamada:

await uploader.EnviarJsonAsync("PRODUTOS-", content);

Python

Instale o pacote:

pip install azure-storage-blob
import os
from datetime import datetime, timezone
from azure.storage.blob import BlobContainerClient, ContentSettings

def enviar_json(prefixo: str, content: str) -> str:
sas_url = os.environ["AZURE_BLOB_SAS_URL"]
timestamp = datetime.now(timezone.utc).strftime("%Y%m%d%H%M%S%f")[:-3]
file_name = f"{prefixo}{timestamp}.json"

container = BlobContainerClient.from_container_url(sas_url)
blob = container.get_blob_client(blob=file_name)
blob.upload_blob(
content.encode("utf-8"),
overwrite=False,
content_settings=ContentSettings(content_type="application/json"),
)
return file_name

Exemplo de chamada:

enviar_json("CLIENTES-", content)

JavaScript / TypeScript

Instale o pacote:

npm install @azure/storage-blob
import { BlobContainerClient } from "@azure/storage-blob";

export async function enviarJson(prefixo: string, content: string): Promise<string> {
const sasUrl = process.env.AZURE_BLOB_SAS_URL;

if (!sasUrl) {
throw new Error("Configure AZURE_BLOB_SAS_URL.");
}

const now = new Date();
const timestamp = now.toISOString()
.replace(/[-:]/g, "")
.replace("T", "")
.replace("Z", "")
.slice(0, 17);
const fileName = `${prefixo}${timestamp}.json`;
const container = new BlobContainerClient(sasUrl);
const blob = container.getBlockBlobClient(fileName);

await blob.uploadData(Buffer.from(content, "utf8"), {
blobHTTPHeaders: { blobContentType: "application/json" },
});
return fileName;
}

Exemplo de chamada:

await enviarJson("MOVIMENTACAO", content);

Java

Adicione a dependência com.azure:azure-storage-blob ao projeto.

import com.azure.storage.blob.BlobClient;
import com.azure.storage.blob.BlobContainerClient;
import com.azure.storage.blob.BlobContainerClientBuilder;
import com.azure.storage.blob.models.BlobHttpHeaders;
import java.io.ByteArrayInputStream;
import java.nio.charset.StandardCharsets;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public final class WeRetailBlobUploader {
private final BlobContainerClient container;
private static final DateTimeFormatter TIMESTAMP =
DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS").withZone(ZoneOffset.UTC);

public WeRetailBlobUploader() {
String sasUrl = System.getenv("AZURE_BLOB_SAS_URL");
container = new BlobContainerClientBuilder()
.endpoint(sasUrl)
.buildClient();
}

public String enviarJson(String prefixo, String content) {
String timestamp = TIMESTAMP.format(ZonedDateTime.now(ZoneOffset.UTC));
String fileName = prefixo + timestamp + ".json";
BlobClient blob = container.getBlobClient(fileName);
byte[] bytes = content.getBytes(StandardCharsets.UTF_8);

blob.upload(new ByteArrayInputStream(bytes), bytes.length, false);
blob.setHttpHeaders(new BlobHttpHeaders().setContentType("application/json"));
return fileName;
}
}

Exemplo de chamada:

uploader.enviarJson("ESTOQUE_PRODUTOS", content);

cURL com URL SAS

Quando a equipe receber uma URL SAS completa, com permissões c (create) e w (write) e prazo de expiração definido, o conteúdo pode ser enviado sem SDK.

curl -X PUT \
--upload-file ./teste.json \
"{CHAVE- DISPONIBILIZADA-WERETAIL}" \
-H "x-ms-blob-type: BlockBlob" \
-H "Content-Type: application/json"

Recomendacoes para producao

  • Se vários processos puderem publicar no mesmo segundo, acrescente milissegundos ou um identificador único ao timestamp para evitar colisões.
  • Não reutilize o mesmo nome de arquivo para conteúdos diferentes.
  • Gere um arquivo por interface e não misture registros de tipos diferentes.
  • Envie UTF-8 e informe Content-Type: application/json.
  • Aguarde uma resposta de sucesso do upload antes de considerar o arquivo publicado.
  • Em caso de timeout, consulte o container antes de reenviar para evitar criar ou processar arquivos desnecessariamente.