USANDO O CONJUNTO DE FERRO

Curl DotNet: Trazendo os superpoderes do Curl para o .NET Runtime

Para todo desenvolvedor .NET, o cenário é familiar demais: Você está lendo a documentação de uma nova API, e o provedor lhe oferece um comando curl para testar um endpoint. Você olha para a sintaxe da ferramenta de linha de comando, suspira, e começa o tedioso processo de traduzi-la para uma nova instância de HttpClient em C#.

Você precisa mapear manualmente os cabeçalhos, garantir que o valor da string para o corpo está codificado corretamente, lidar com o agente do usuário, e torcer para não ter perdido um padrão silencioso. Este processo manual de copiar e traduzir do bash é propenso a erros. Um cabeçalho ausente, e seu pedido HTTP falha.

Entre CurlDotNet. Criado por Jacob Mellor, o CTO da Iron Software, esta biblioteca .NET muda completamente o fluxo de trabalho. Permite que você cole comandos curl diretamente em seu código e os execute com o mesmo comportamento que você espera do terminal.

O que é Curl DotNet?

CurlDotNet é uma implementação pura .NET da ferramenta de linha de comando curl. Diferente de outros wrappers, esta biblioteca não possui dependências nativas (como libcurl.dll). É construída inteiramente em código gerenciado, o que significa que ela roda perfeitamente no Windows, Linux e macOS sem a necessidade de configuração complexa.

Quer você esteja trabalhando em um aplicativo web em Net Core, um aplicativo de console ou pipelines de CI, o CurlDotNet traz verdadeira semântica curl para o runtime .NET.

Principais características

  • Tradução Zero: Cole comandos curl HTTPS diretamente no seu código-fonte C#.

  • Multiplataforma: Suporte completo para Windows, Linux, MacOS e mais.

  • Segurança de Tipo: Opção para usar um construtor fluente para cenários de injeção de dependência.

  • Observabilidade: Suporte embutido para emitir eventos estruturados para registro.

Introdução: Instalar e Executar

Para começar, você precisa instalar o pacote curldotnet via seu gerenciador de pacotes. Você pode encontrar a versão mais recente nas notas de lançamento ou simplesmente executar:

dotnet add package CurlDotNet

Uma vez instalado, você pode executar uma chamada curl imediatamente.

A API de String: Cole e Use Comandos Curl

Este método é perfeito para verificações de saúde, agentes de suporte ou prototipagem rápida. Você simplesmente passa o comando curl como uma string.

using CurlDotNet;

// Simply paste the command string
var response = await Curl.ExecuteAsync("curl https://api.github.com/users/octocat");

// Access the data
Console.WriteLine(response.Body);
using CurlDotNet;

// Simply paste the command string
var response = await Curl.ExecuteAsync("curl https://api.github.com/users/octocat");

// Access the data
Console.WriteLine(response.Body);
$vbLabelText   $csharpLabel

Usando o Construtor Fluente com Variáveis de Ambiente

Para aplicações de produção onde você precisa lidar com dados sensíveis via variáveis de ambiente, ou requer uma arquitetura mais limpa, o construtor fluente é ideal. Você pode especificar um nome de string para cabeçalhos ou definir um caminho de arquivo explicitamente.

var response = await Curl.GetAsync("https://api.example.com/data")
    .WithHeader("Authorization", "Bearer " + Environment.GetEnvironmentVariable("API_KEY"))
    .WithTimeout(TimeSpan.FromSeconds(30))
    .ExecuteAsync();
var response = await Curl.GetAsync("https://api.example.com/data")
    .WithHeader("Authorization", "Bearer " + Environment.GetEnvironmentVariable("API_KEY"))
    .WithTimeout(TimeSpan.FromSeconds(30))
    .ExecuteAsync();
$vbLabelText   $csharpLabel

A Conexão Iron Software: Integrações do Mundo Real

CurlDotNet é patrocinado pela Iron Software, uma empresa dedicada a construir ferramentas que resolvem os problemas mais difíceis para desenvolvedores. Jacob Mellor criou o CurlDotNet com a mesma filosofia que impulsiona a suíte Iron Software: a experiência do desenvolvedor é prioridade.

O verdadeiro poder do CurlDotNet é desbloqueado quando combinado com produtos da Iron Software. Você pode usar o Curl para a camada de transporte complexa (lidando com proxies, autenticação legada ou peculiaridades específicas do curl http) e bibliotecas Iron para o processamento pesado de documentos.

Exemplo 1: Download Seguro de PDF e Edição com IronPDF

IronPDF

IronPDF é o padrão da indústria para gerar PDFs com perfeição de pixel em .NET. Ao contrário de outras bibliotecas que têm dificuldades com padrões web modernos, o IronPDF renderiza HTML, CSS e JavaScript exatamente como um navegador Chrome faria. Ele é construído para ser uma solução completa: você pode gerar novos documentos a partir de strings HTML ou arquivos, editar PDFs existentes, mesclar documentos e aplicar recursos de segurança como marca d'água e criptografia sem a necessidade de dependências externas ou Adobe Acrobat instalado no servidor.

Imagine que você precisa baixar uma fatura gerada de um sistema interno legado que requer flags curl complexas (como ignorar erros de SSL ou permutações de cabeçalho específicas), e então marcá-lo com o IronPDF.

Traduzir esse pedido para HttpClient pode levar horas de depuração. Com CurlDotNet, você cola o comando, obtém os bytes e os entrega ao IronPDF.

using CurlDotNet;
using IronPdf;

// 1. Use CurlDotNet to handle the complex transport
// We use -k to allow insecure SSL (common in legacy internal apps)
var curlCommand = "curl -k https://internal-billing.local/invoice/1234 -H 'X-Dept: Sales'";
var response = await Curl.ExecuteAsync(curlCommand);

if (response.IsSuccess)
{
    // 2. Pass the raw bytes directly to IronPDF
    // IronPDF renders the PDF from the downloaded data
    var pdfDocument = PdfDocument.FromPdf(response.BodyBytes);

    // 3. Apply a watermark and save
    pdfDocument.ApplyWatermark("CONFIDENTIAL", 30, VerticalAlignment.Middle, HorizontalAlignment.Center);
    pdfDocument.SaveAs("Processed_Invoice.pdf");

    Console.WriteLine("Invoice downloaded and secured via IronPDF.");
}
using CurlDotNet;
using IronPdf;

// 1. Use CurlDotNet to handle the complex transport
// We use -k to allow insecure SSL (common in legacy internal apps)
var curlCommand = "curl -k https://internal-billing.local/invoice/1234 -H 'X-Dept: Sales'";
var response = await Curl.ExecuteAsync(curlCommand);

if (response.IsSuccess)
{
    // 2. Pass the raw bytes directly to IronPDF
    // IronPDF renders the PDF from the downloaded data
    var pdfDocument = PdfDocument.FromPdf(response.BodyBytes);

    // 3. Apply a watermark and save
    pdfDocument.ApplyWatermark("CONFIDENTIAL", 30, VerticalAlignment.Middle, HorizontalAlignment.Center);
    pdfDocument.SaveAs("Processed_Invoice.pdf");

    Console.WriteLine("Invoice downloaded and secured via IronPDF.");
}
$vbLabelText   $csharpLabel

Confirmação no Console

Confirmação escrita no console confirmando que o PDF foi salvo

Saída em PDF

Arquivo PDF de saída do exemplo

Exemplo 2: Raspagem e OCR com IronOCR

IronOCR

IronOCR é uma biblioteca avançada de reconhecimento óptico de caracteres alimentada pelo motor Tesseract 5, afinada especificamente para C# e .NET. Ele suporta mais de 127 idiomas e se destaca na leitura de texto de fontes imperfeitas—pense em digitalizações de baixa resolução, imagens rotacionadas ou fundos ruidosos. Suas capacidades de "Visão Computacional" permitem que detecte regiões de texto automaticamente, e ele pode produzir dados não apenas como strings simples, mas como conteúdo estruturado (códigos de barras, parágrafos, linhas e caracteres) para análise profunda.

Às vezes você precisa extrair dados de uma imagem hospedada em um servidor que bloqueia raspadores padrão .NET. Você pode usar o CurlDotNet para imitar um agente de usuário de navegador padrão sem esforço e, em seguida, usar o IronOCR para ler o texto.

using CurlDotNet;
using IronOcr;

// 1. Fetch the image using a specific browser User-Agent to bypass blocks
var imgResponse = await Curl.GetAsync("https://site.com/protected-captcha.png")
    .WithUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)")
    .ExecuteAsync();

// 2. Use IronOCR to read text from the file bytes
var ocr = new IronTesseract();
using (var input = new OcrInput())
{
    input.AddImage(imgResponse.BodyBytes);
    var result = ocr.Read(input);

    // 3. Output the extracted string value
    Console.WriteLine($"OCR Result: {result.Text}");
}
using CurlDotNet;
using IronOcr;

// 1. Fetch the image using a specific browser User-Agent to bypass blocks
var imgResponse = await Curl.GetAsync("https://site.com/protected-captcha.png")
    .WithUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64)")
    .ExecuteAsync();

// 2. Use IronOCR to read text from the file bytes
var ocr = new IronTesseract();
using (var input = new OcrInput())
{
    input.AddImage(imgResponse.BodyBytes);
    var result = ocr.Read(input);

    // 3. Output the extracted string value
    Console.WriteLine($"OCR Result: {result.Text}");
}
$vbLabelText   $csharpLabel

Exemplo de Saída OCR

Exemplo de saída ao usar o IronOCR com CurlDotNet

Exemplo 3: Gerenciamento de Inventário com IronBarcode

IronBarcode

IronBarcode é uma biblioteca versátil projetada para ler e escrever virtualmente qualquer formato de código de barras, desde UPCs e EANs padrão até códigos QR complexos e etiquetas Data Matrix. Ele é construído para tolerância a falhas; a biblioteca inclui filtros automáticos de correção de imagem que podem afiar, potencialmente binarizar e rotacionar imagens para detectar códigos de barras mesmo se estiverem danificados, inclinados ou mal iluminados. Isso faz dele uma ferramenta essencial para aplicações de logística, varejo e industriais onde scanners de hardware não estão disponíveis.

Neste cenário, usamos o controle preciso da rede do CurlDotNet para buscar um rótulo de uma API segura, e o robusto motor de leitura do IronBarcode para verificar o conteúdo instantaneamente.

using CurlDotNet;
using IronBarCode;

class Program
{
    private static readonly HttpClient client = new HttpClient();
    public static async Task Main(string[] args)
    {

        // 1. Define the URL 
        string url = "https://barcodeapi.org/api/128/Shipping-Label-Test-123";

        try
        {
            // Add the session cookie to the request headers
            client.DefaultRequestHeaders.Add("Cookie", "session_id=xyz123");

            // 2. Download the image data as a Byte Array (Preserves binary integrity)
            byte[] imageBytes = await client.GetByteArrayAsync(url);

            Console.WriteLine($"Downloaded {imageBytes.Length} bytes.");

            // 3. Read the barcode directly from the byte array
            var result = BarcodeReader.Read(imageBytes);

            foreach (var barcode in result)
            {
                Console.WriteLine($"Detected Format: {barcode.BarcodeType}");
                Console.WriteLine($"Value: {barcode.Value}");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }
    }
}
using CurlDotNet;
using IronBarCode;

class Program
{
    private static readonly HttpClient client = new HttpClient();
    public static async Task Main(string[] args)
    {

        // 1. Define the URL 
        string url = "https://barcodeapi.org/api/128/Shipping-Label-Test-123";

        try
        {
            // Add the session cookie to the request headers
            client.DefaultRequestHeaders.Add("Cookie", "session_id=xyz123");

            // 2. Download the image data as a Byte Array (Preserves binary integrity)
            byte[] imageBytes = await client.GetByteArrayAsync(url);

            Console.WriteLine($"Downloaded {imageBytes.Length} bytes.");

            // 3. Read the barcode directly from the byte array
            var result = BarcodeReader.Read(imageBytes);

            foreach (var barcode in result)
            {
                Console.WriteLine($"Detected Format: {barcode.BarcodeType}");
                Console.WriteLine($"Value: {barcode.Value}");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }
    }
}
$vbLabelText   $csharpLabel

Saída do Console do IronBarcode

Exemplo de saída ao usar o IronBarcode com CurlDotNet

Levando "Userland" for .NET

O conceito CurlDotNet de levar "Userland" for .NET é sobre mais do que apenas fazer requisições. Permite que você use funcionalidades padrão do curl em lugares como pipelines de CI ou contêineres Docker rodando Linux, macOS ou Windows.

Você pode utilizá-lo para baixar arquivos, enviar dados ou acionar webhooks usando a sintaxe padrão do bash em um contexto de execução do DotNet. Isso preenche a lacuna entre o mundo das ferramentas de linha de comando e sua aplicação compilada.

Conclusão: O Fim do Imposto de Tradução

Não é apenas sobre fazer requisições HTTP; é sobre respeitar o tempo do desenvolvedor. Jacob Mellor e Iron Software entendem que se uma ferramenta como curl funcionou perfeitamente por 25 anos, o runtime do .NET deve adotá-la, não obrigá-lo a reimplementá-la.

Ao adotar o CurlDotNet, você não está apenas adicionando uma dependência; você está adotando um fluxo de trabalho que prioriza o envio de recursos em vez de escrever código repetitivo. Você para de 'traduzir' e começa a executar. Quer você esteja obtendo um único arquivo JSON ou orquestrando fluxos de trabalho complexos de documentos Iron Software, a instrução permanece a mesma: colar, executar, feito.

Próximos passos

Pare de perder tempo traduzindo cabeçalhos e depurando HttpClient. Junte-se ao movimento Userland.NET.

  1. Verifique o GitHub: Visite jacob-mellor/curl-dot-net para ver o código-fonte, documentação e diretório de exemplos.

  2. Baixe o Pacote NuGet: Execute DotNet add package CurlDotNet para instalar a biblioteca.

  3. Explore o Iron Software: Veja como IronPDF e IronOCR podem trabalhar em conjunto com CurlDotNet para acelerar seu projeto.

Aproveitando o CurlDotNet, você garante que seus comandos curl e seu código C# falem a mesma linguagem exata.