CSharpEssentials.Http
5.1.0
See the version list below for details.
dotnet add package CSharpEssentials.Http --version 5.1.0
NuGet\Install-Package CSharpEssentials.Http -Version 5.1.0
<PackageReference Include="CSharpEssentials.Http" Version="5.1.0" />
<PackageVersion Include="CSharpEssentials.Http" Version="5.1.0" />
<PackageReference Include="CSharpEssentials.Http" />
paket add CSharpEssentials.Http --version 5.1.0
#r "nuget: CSharpEssentials.Http, 5.1.0"
#:package CSharpEssentials.Http@5.1.0
#addin nuget:?package=CSharpEssentials.Http&version=5.1.0
#tool nuget:?package=CSharpEssentials.Http&version=5.1.0
CSharpEssentials.Http
HttpClient extensions that return Result<T> instead of throwing exceptions. Built-in status-code-to-error mapping, fluent request builder, Polly resilience, and redirect handling.
Features
- Result-based HTTP:
GetFromJsonAsResultAsync,PostAsJsonAsResultAsync,PutAsJsonAsResultAsync,PatchAsJsonAsResultAsync,DeleteAsResultAsync. - Automatic Error Mapping: HTTP codes mapped to
ErrorType(Validation, Unauthorized, NotFound, Conflict, etc.). - Fluent Request Builder: Chain headers, query params, JSON content, and redirects.
- Polly Integration: Retry, timeout, and circuit breaker pipelines.
- Query String Helpers: Build URIs from dictionaries or anonymous objects.
Installation
dotnet add package CSharpEssentials.Http
Usage
GET, POST, PUT, PATCH, DELETE as Result
using CSharpEssentials.Http;
using CSharpEssentials.ResultPattern;
HttpClient client = new() { BaseAddress = new Uri("https://api.example.com") };
Result<User> user = await client.GetFromJsonAsResultAsync<User>(new Uri("/users/1", UriKind.Relative));
Result<User> created = await client.PostAsJsonAsResultAsync<User>(
new Uri("/users", UriKind.Relative),
new { Name = "Alice", Age = 30 });
Result deleted = await client.DeleteAsResultAsync(new Uri("/users/1", UriKind.Relative));
HttpRequestBuilder
Result<User> result = await HttpRequestBuilder
.Get("/users/1")
.WithHeader("Accept", "application/json")
.WithQuery("include", "profile")
.AsResultAsync<User>(client);
Result created = await HttpRequestBuilder
.Post("/users")
.WithJsonContent(new { Name = "Bob" })
.AsResultAsync(client);
Enums in route, query and body
Enums with [StringEnum] are written as wire names; WithEnumConventions(conventions, EnumWireFormat.Number) writes numbers for servers that accept only integers. Flags and enum collections become repeated query keys, and an undefined value is never sent.
Result<Order> result = await HttpRequestBuilder
.Get("https://api.example.com/orders/{status}")
.WithEnumConventions(EnumConventions.Default)
.WithRoute("status", OrderStatus.PendingApproval) // /orders/pending_approval
.WithQuery("permissions", Permissions.Read | Permissions.Write) // ?permissions=read&permissions=write
.AsResultAsync<Order>(client, options);
Build options once with new JsonSerializerOptions(JsonSerializerDefaults.Web).AddEnumConventions(conventions, EnumReadMode.Data, writeAs). Responses are then read tolerantly: wire names, member names, aliases and numbers, with the [EnumFallback] member for values a newer server adds. Plain enums without [StringEnum] keep the framework behavior.
Roll out consumers before producers: a server moves its output from Number to String only after every client reads names.
Query String Builder
Uri uri = new Uri("https://api.example.com/search");
Uri withQuery = uri.WithQueryString("q", "csharp").Value;
Uri withDict = uri.WithQueryString(new Dictionary<string, string?> { { "page", "1" } }).Value;
Polly Resilience
var pipeline = HttpClientResilienceExtensions.CreateResiliencePipeline(
maxRetryAttempts: 3,
timeout: TimeSpan.FromSeconds(30));
Result<User> result = await pipeline.ExecuteAsResultAsync(async token =>
await client.GetFromJsonAsResultAsync<User>(new Uri("/users/1", UriKind.Relative), cancellationToken: token));
Redirect Following
Result<User> result = await HttpRequestBuilder
.Get("/legacy-url")
.FollowRedirects(maxRedirects: 3)
.AsResultAsync<User>(client);
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. net11.0 is compatible. |
| .NET Core | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.1 is compatible. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.1
- CSharpEssentials.Errors (>= 5.1.0)
- CSharpEssentials.Json (>= 5.1.0)
- CSharpEssentials.Resilience (>= 5.1.0)
- CSharpEssentials.Results (>= 5.1.0)
- Polly.Core (>= 8.0.0 && < 9.0.0)
- System.Net.Http.Json (>= 9.0.0)
- System.Text.Json (>= 9.0.4)
-
net10.0
- CSharpEssentials.Errors (>= 5.1.0)
- CSharpEssentials.Json (>= 5.1.0)
- CSharpEssentials.Resilience (>= 5.1.0)
- CSharpEssentials.Results (>= 5.1.0)
- Polly.Core (>= 8.0.0 && < 9.0.0)
-
net11.0
- CSharpEssentials.Errors (>= 5.1.0)
- CSharpEssentials.Json (>= 5.1.0)
- CSharpEssentials.Resilience (>= 5.1.0)
- CSharpEssentials.Results (>= 5.1.0)
- Polly.Core (>= 8.0.0 && < 9.0.0)
-
net9.0
- CSharpEssentials.Errors (>= 5.1.0)
- CSharpEssentials.Json (>= 5.1.0)
- CSharpEssentials.Resilience (>= 5.1.0)
- CSharpEssentials.Results (>= 5.1.0)
- Polly.Core (>= 8.0.0 && < 9.0.0)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on CSharpEssentials.Http:
| Package | Downloads |
|---|---|
|
CSharpEssentials
A comprehensive C# library enhancing functional programming capabilities with type-safe monads (Maybe, Result), discriminated unions (Any), and robust error handling. Features include: domain-driven design support, enhanced Entity Framework integration, testable time management, JSON utilities, and LINQ extensions. Built for modern C# development with focus on maintainability, testability, and functional programming principles. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 6.5.2 | 119 | 10/10/2026 |
| 6.5.1 | 111 | 10/10/2026 |
| 6.5.0 | 111 | 10/9/2026 |
| 6.4.0 | 113 | 10/9/2026 |
| 6.3.0 | 113 | 10/8/2026 |
| 6.2.0 | 111 | 10/8/2026 |
| 6.1.0 | 112 | 10/7/2026 |
| 6.0.0 | 116 | 10/7/2026 |
| 5.2.1 | 109 | 10/7/2026 |
| 5.2.0 | 115 | 10/7/2026 |
| 5.1.0 | 108 | 10/7/2026 |
| 5.0.0 | 112 | 10/6/2026 |
| 4.1.0 | 116 | 10/6/2026 |
| 4.0.0 | 112 | 10/5/2026 |
| 3.2.3 | 350 | 5/31/2026 |
| 3.2.2 | 170 | 5/31/2026 |
| 3.2.1 | 164 | 5/31/2026 |
| 3.2.0 | 156 | 5/30/2026 |
| 3.1.0 | 168 | 5/27/2026 |
| 3.0.8 | 163 | 5/20/2026 |