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) ew(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
| Interface | Prefixo |
|---|---|
| Lojas | LOJAS- |
| Vendedores | VENDEDORES- |
| Clientes | CLIENTES- |
| Produtos | PRODUTOS- |
| Estoque | ESTOQUE_PRODUTOS- |
| Movimentações | MOVIMENTACAO- |
| Pedidos | PEDIDO_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.