UżYWANIE IRON SUITE

Curl DotNet: Dodanie supermocy Curl do środowiska .NET

Każdy programista .NET zna ten scenariusz: czytasz dokumentację nowego API, a dostawca podaje Ci polecenie curl do przetestowania punktu końcowego. Wpatrujesz się w składnię narzędzia wiersza poleceń, wzdychasz i rozpoczynasz żmudny proces przekształcania jej w nową instancję HttpClient w języku C#.

Musisz ręcznie przypisać nagłówki, upewnić się, że wartość ciągu znaków w treści jest poprawnie zakodowana, zająć się agentem użytkownika i mieć nadzieję, że nie przeoczyłeś żadnego cichego domyślnego ustawienia. Ten ręczny proces kopiowania i tłumaczenia w bash jest podatny na błędy. Wystarczy jeden brakujący nagłówek, a żądanie HTTP zakończy się niepowodzeniem.

Wprowadź CurlDotNet. Stworzona przez Jacoba Mellora, dyrektóra ds. technologii w Iron Software, ta biblioteka .NET całkowicie zmienia przebieg pracy. Pozwala to na wklejenie poleceń curl bezpośrednio do kodu i wykonanie ich z takim samym zachowaniem, jakiego oczekujesz od terminala.

Czym jest Curl .NET?

CurlDotNet to implementacja narzędzia curl CLI w czystym środowisku .NET. W przeciwieństwie do innych opakowań, ta biblioteka nie ma żadnych natywnych zależności (takich jak libcurl.dll). Jest w całości zbudowany w kodzie zarządzanym, co oznacza, że działa płynnie na systemach Windows, Linux i macOS bez skomplikówanej konfiguracji.

Niezależnie od tego, czy pracujesz nad aplikacją internetową w .NET Core, aplikacją konsolową czy potokami CI, CurlDotNet zapewnia prawdziwą semantykę curl w środowisku uruchomieniowym .NET.

Najważniejsze cechy

  • Zero Translation: Wklej polecenie curl HTTPS bezpośrednio do kodu źródłowego C#.

  • Wielopłatformowość: Pełna obsługa systemów Windows, Linux, MacOS i innych.

  • Bezpieczeństwo typów: Możliwość użycia płynnego Buildersa w scenariuszach wstrzykiwania zależności.

  • Obserwowalność: Wbudowana obsługa generowania zdarzeń strukturalnych do rejestrowania.

Pierwsze kroki: Instalacja i uruchomienie

Aby rozpocząć, należy zainstalować pakiet curldotnet za pomocą menedżera pakietów. Najnowszą wersję można znaleźć w informacjach o wydaniu lub po prostu uruchomić:

dotnet add package CurlDotNet

Po zainstalowaniu można natychmiast wykonać wywołanie curl.

Interfejs API String: Polecenia Curl typu "wklej i uruchom"

Ta metoda jest idealna do kontroli stanu, obsługi technicznej lub szybkiego prototypowania. Wystarczy przekazać polecenie curl jako ciąg znaków.

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);
Imports CurlDotNet

' Simply paste the command string
Dim response = Await Curl.ExecuteAsync("curl https://api.github.com/users/octocat")

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

Korzystanie z Fluent Builder przy użyciu zmiennych środowiskowych

W przypadku aplikacji produkcyjnych, w których konieczne jest przetwarzanie wrażliwych danych za pomocą zmiennych środowiskowych lub wymagana jest bardziej przejrzysta architektura, idealnym rozwiązaniem jest Fluent Builder. Można podać nazwę ciągu znaków dla nagłówków lub jawnie ustawić ścieżkę do pliku.

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();
Dim response = Await Curl.GetAsync("https://api.example.com/data") _
    .WithHeader("Authorization", "Bearer " & Environment.GetEnvironmentVariable("API_KEY")) _
    .WithTimeout(TimeSpan.FromSeconds(30)) _
    .ExecuteAsync()
$vbLabelText   $csharpLabel

Iron Software Connection: integracje w praktyce

CurlDotNet jest sponsorowany przez Iron Software, firmę zajmującą się tworzeniem narzędzi, które rozwiązują najtrudniejsze problemy programistów. Jacob Mellor stworzył CurlDotNet w oparciu o tę samą filozofię, która przyświeca Iron Suite: doświadczenie programisty jest najważniejsze.

Prawdziwy potencjał CurlDotNet ujawnia się w połączeniu z produktami Iron Software. Możesz użyć Curl do obsługi złożonej warstwy transportowej (obsługa proxy, starszych metod uwierzytelniania lub specyficznych dziwactw curl http) oraz bibliotek Iron do ciężkiej pracy związanej z przetwarzaniem dokumentów.

Przykład 1: Bezpieczne pobieranie i edycja plików PDF za pomocą IronPDF

IronPDF

IronPDF to branżowy standard tworzenia plików PDF o idealnej jakości pikseli w środowisku .NET. W przeciwieństwie do innych bibliotek, które mają problemy z nowoczesnymi standardami webowymi, IronPDF renderuje HTML, CSS i JavaScript dokładnie tak, jak przeglądarka Chrome. Został zbudowany jako kompletne rozwiązanie: możesz generować nowe dokumenty z łańcuchów HTML lub plików, edytować istniejące PDFy, łączyć dokumenty, i stosować funkcje zabezpieczeń jak znak wodny i szyfrowanie bez potrzeby instalowania zewnętrznych zależności lub Adobe Acrobat na serwerze.

Wyobraź sobie, że musisz pobrać wygenerowaną fakturę ze starszego systemu wewnętrznego, który wymaga złożonych flag curl (takich jak ignorowanie błędów SSL lub konkretnych permutacji nagłówków), a następnie opatrzyćznakiem wodnym za pomocą IronPDF.

Przekształcenie tego żądania na HttpClient może zająć wiele godzin debugowania. Dzięki CurlDotNet wystarczy wkleić polecenie, pobrać bajty i przekazać je do 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.");
}
Imports CurlDotNet
Imports IronPdf

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

If response.IsSuccess Then
    ' 2. Pass the raw bytes directly to IronPDF
    ' IronPDF renders the PDF from the downloaded data
    Dim 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.")
End If
$vbLabelText   $csharpLabel

Potwierdzenie w konsoli

Potwierdzenie zapisane w konsoli potwierdzające, że PDF został zapisany

Wynik w formacie PDF

Przykładowy plik wyjściowy PDF

Przykład 2: Scraping i OCR z IronOCR

IronOCR

IronOCR to zaawansowana biblioteka rozpoznawania tekstu oparta na silniku Tesseract 5, dostrojona specjalnie dla C# i .NET. Obsługuje ponad 127 języków i doskonale radzi sobie z odczytywaniem tekstu z niedoskonałych źródeł—pomyśl o skanach niskiej rozdzielczości, obróconych obrazach lub zakłóconym tle. Jego funkcje "Computer Vision" pozwalają na automatyczne wykrywanie obszarów tekstu, a dane mogą być wyświetlane nie tylko jako zwykłe ciągi znaków, ale jako treść ustrukturyzowana (BarCode, akapity, wiersze i znaki) do dogłębnej analizy.

Czasem potrzebujesz wyodrębnić dane z obrazu umieszczonego na serwerze, który blokuje standardowe skanery .NET. Możesz użyć CurlDotNet, aby bez wysiłku naśladować standardowego agenta użytkownika przeglądarki, a następnie użyć IronOCR do odczytania tekstu.

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}");
}
Imports CurlDotNet
Imports IronOcr

' 1. Fetch the image using a specific browser User-Agent to bypass blocks
Dim 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
Dim ocr = New IronTesseract()
Using input = New OcrInput()
    input.AddImage(imgResponse.BodyBytes)
    Dim result = ocr.Read(input)

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

Przykładowy wynik OCR

Przykładowy wynik użycia IronOCR z CurlDotNet

Przykład 3: Zarządzanie zapasami za pomocą IronBarcode

IronBarcode

IronBarcode to wszechstronna biblioteka zaprojektowana do odczytywania i zapisywania praktycznie każdego formatu kodu kreskowego, od standardowych UPC i EAN po złożone kody QR i tagi Data Matrix. Została zaprojektowana z myślą o odporności na awarie; biblioteka zawiera automatyczne filtry korekcji obrazu, które mogą wyostrzać, binarizować i obracać obrazy w celu wykrycia kodów kreskowych, nawet jeśli są uszkodzone, przekrzywione lub słabo oświetlone. To sprawia, że jest to niezbędne narzędzie w logistyce, handlu detalicznym i zastosowaniach przemysłowych, gdzie skanery sprzętowe nie są dostępne.

W tym scenariuszu używamy precyzyjnej kontroli sieci w CurlDotNet, aby pobrać etykietę z zabezpieczonego API, oraz silnika odczytu w IronBarcode, aby natychmiast zweryfikować zawartość.

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}");
        }
    }
}
Imports CurlDotNet
Imports IronBarCode
Imports System.Net.Http

Module Program
    Private ReadOnly client As New HttpClient()

    Public Async Function Main(args As String()) As Task

        ' 1. Define the URL 
        Dim url As String = "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)
            Dim imageBytes As Byte() = Await client.GetByteArrayAsync(url)

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

            ' 3. Read the barcode directly from the byte array
            Dim result = BarcodeReader.Read(imageBytes)

            For Each barcode In result
                Console.WriteLine($"Detected Format: {barcode.BarcodeType}")
                Console.WriteLine($"Value: {barcode.Value}")
            Next
        Catch ex As Exception
            Console.WriteLine($"Error: {ex.Message}")
        End Try
    End Function
End Module
$vbLabelText   $csharpLabel

Wynik działania konsoli IronBarcode

Przykładowy wynik użycia IronBarcode z CurlDotNet

Wprowadzenie "Userland" do .NET

Wprowadzenie przez CurlDotNet koncepcji "Userland" do środowiska .NET to coś więcej niż tylko wysyłanie żądań. Pozwala to na korzystanie ze standardowej funkcjonalności curl w takich miejscach jak potoki CI lub kontenery Docker działające pod kontrolą systemów Linux, macOS lub Windows.

Możesz go użyć do pobierania plików, przesyłania danych lub uruchamiania webhooków, korzystając ze standardowej składni bash w kontekście uruchomieniowym .NET. To wypełnia lukę między światem narzędzi wiersza poleceń a Twoją skompilowaną aplikacją.

Wniosek: Koniec z "podatkiem od tłumaczeń"

Nie chodzi tylko o wysyłanie żądań HTTP; Chodzi o szacunek dla czasu programisty. Jacob Mellor i Iron Software rozumieją, że jeśli narzędzie takie jak curl działało idealnie przez 25 lat, środowisko uruchomieniowe .NET powinno je zaakceptować, a nie zmuszać do ponownego wdrażania.

Wdrażając CurlDotNet, nie dodajesz jedynie zależności; Wdrażasz proces, w którym priorytetem jest dostarczanie funkcji, a nie pisanie szablonowych fragmentów kodu. Przestajesz "tłumaczyć" i zaczynasz działać. Niezależnie od tego, czy pobierasz pojedynczy plik JSON, czy orkiestrujesz złożone przepływy pracy związane z dokumentami w produktach Iron Software, instrukcja pozostaje taka sama: wklej, uruchom, gotowe.

Kolejne kroki

Nie trać czasu na tłumaczenie nagłówków i debugowanie HttpClient. Dołącz do ruchu Userland.NET.

  1. Sprawdź GitHub: Odwiedź jacob-mellor/curl-.NET, aby zobaczyć kod źródłowy, dokumentację i katalog przykładów.

  2. Pobierz pakiet NuGet: Uruchom .NET add package CurlDotNet, aby zainstalować bibliotekę.

  3. Odkryj Iron Software: Zobacz, jak IronPDF i IronOCR mogą współdziałać z CurlDotNet, aby przyspieszyć Twój projekt.

Korzystając z CurlDotNet, masz pewność, że Twoje polecenia curl i kod C# mówią dokładnie tym samym językiem.