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, dyrektora 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 DotNet?
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)
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 wymagańa 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()
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 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ą trudności z obsługą nowoczesnych standardów internetowych, IronPDF renderuje HTML, CSS i JavaScript dokładnie tak, jak robi to przeglądarka Chrome. Jest to kompletne rozwiązanie: można generować nowe dokumenty na podstawie ciągów znaków HTML lub plików, edytować istniejące pliki PDF, łączyć dokumenty oraz stosować zabezpieczenia, takie jak znaki wodne i szyfrowanie, bez konieczności korzystania z zewnętrznych zależności lub instalowania programu 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ć ją 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
Potwierdzenie w konsoli

Wynik w formacie PDF

Przykład 2: Scraping i OCR z IronOCR

IronOCR to zaawansowana biblioteka do optycznego rozpoznawania znaków oparta na silniku Tesseract 5, dostosowana specjalnie do języka C# i platformy .NET. Obsługuje ponad 127 języków i doskonale radzi sobie z odczytywaniem tekstu z niedoskonałych źródeł — takich jak skany o niskiej rozdzielczości, obrócone obrazy lub tła z zakłóceniami. 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.
Czasami trzeba wyodrębnić dane z obrazu umieszczonego na serwerze, który blokuje standardowe narzędzia do scrapingu .NET Standard. 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
Przykładowy wynik OCR

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

Biblioteka IronBarcode to wszechstronna biblioteka zaprojektowana do odczytu i zapisu praktycznie każdego formatu kodów kreskowych, od standardowych kodów 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 filtry automatycznej korekcji obrazu, które mogą wyostrzać, binarizować i obracać obrazy w celu wykrycia BARCODE'ów, nawet jeśli są one 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 wykorzystujemy precyzyjną kontrolę sieciową CurlDotNet do pobrania etykiety z bezpiecznego API oraz solidny silnik odczytu IronBarcode do natychmiastowej weryfikacji treści.
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
Wynik działania konsoli IronBarcode

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żna go używać do pobierania plików, przesyłania danych lub uruchamiania webhooków przy użyciu standardowej składni bash w kontekście uruchomienia DotNet. 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 koordynujesz złożone procesy związane z dokumentacją 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.
-
Sprawdź GitHub: Odwiedź stronę jacob-mellor/curl-dot-net, aby zapoznać się z kodem źródłowym, dokumentacją i katalogiem przykładów.
-
Pobierz pakiet NuGet: Uruchom polecenie DotNet add package CurlDotNet, aby zainstalować bibliotekę.
- Poznaj oprogramowanie Iron Software: Zobacz, jak IronPDF i IronOCR mogą współpracować z CurlDotNet, aby przyspieszyć realizację Twojego projektu.
Korzystając z CurlDotNet, masz pewność, że Twoje polecenia curl i kod C# mówią dokładnie tym samym językiem.