FluentRest.Factory
9.9.3
See the version list below for details.
dotnet add package FluentRest.Factory --version 9.9.3
NuGet\Install-Package FluentRest.Factory -Version 9.9.3
<PackageReference Include="FluentRest.Factory" Version="9.9.3" />
paket add FluentRest.Factory --version 9.9.3
#r "nuget: FluentRest.Factory, 9.9.3"
// Install FluentRest.Factory as a Cake Addin #addin nuget:?package=FluentRest.Factory&version=9.9.3 // Install FluentRest.Factory as a Cake Tool #tool nuget:?package=FluentRest.Factory&version=9.9.3
FluentRest
Lightweight fluent wrapper over HttpClient to make REST calls easier
Download
The FluentRest library is available on nuget.org via package name FluentRest
.
To install FluentRest, run the following command in the Package Manager Console
PM> Install-Package FluentRest
More information about NuGet package available at https://nuget.org/packages/FluentRest
Development Builds
Development builds are available on the feedz.io feed. A development build is promoted to the main NuGet feed when it's determined to be stable.
In your Package Manager settings add the following package source for development builds: https://f.feedz.io/loresoft/open/nuget/index.json
Features
- Fluent request building
- Fluent form data building
- Automatic deserialization of response content
- Plugin different serialization
- Fake HTTP responses for testing
- Support HttpClientFactory typed client and middleware handlers
Fluent Request
Create a form post request
var client = new HttpClient();
client.BaseAddress = new Uri("http://httpbin.org/", UriKind.Absolute);
var result = await client.PostAsync<EchoResult>(b => b
.AppendPath("Project")
.AppendPath("123")
.FormValue("Test", "Value")
.FormValue("key", "value")
.QueryString("page", 10)
);
Custom authorization header
var client = new HttpClient();
client.BaseAddress = new Uri("https://api.github.com/", UriKind.Absolute);
var result = await client.GetAsync<Repository>(b => b
.AppendPath("repos")
.AppendPath("loresoft")
.AppendPath("FluentRest")
.Header(h => h.Authorization("token", "7ca..."))
);
Use with HttpClientFactory and Retry handler
var services = new ServiceCollection();
services.AddSingleton<IContentSerializer, JsonContentSerializer>();
services.AddHttpClient<GithubClient>(c =>
{
c.BaseAddress = new Uri("https://api.github.com/");
c.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
c.DefaultRequestHeaders.Add("User-Agent", "GitHubClient");
})
.AddHttpMessageHandler(() => new RetryHandler());
var serviceProvider = services.BuildServiceProvider();
var client = serviceProvider.GetService<GithubClient>();
var result = await client.GetAsync<Repository>(b => b
.AppendPath("repos")
.AppendPath("loresoft")
.AppendPath("FluentRest")
);
Fake Response
FluentRest.Fake
package adds the ability to fake an HTTP responses by using a custom HttpClientHandler. Faking the HTTP response allows creating unit tests without having to make the actual HTTP call.
To install FluentRest.Fake, run the following command in the Package Manager Console
PM> Install-Package FluentRest.Fake
Fake Response Stores
Fake HTTP responses can be stored in the following message stores. To create your own message store, implement IFakeMessageStore
.
MemoryMessageStore
The memory message store allows composing a JSON response in the unit test. Register the responses on the start of the unit test.
Register a fake response by URL.
MemoryMessageStore.Current.Register(b => b
.Url("https://api.github.com/repos/loresoft/FluentRest")
.StatusCode(HttpStatusCode.OK)
.ReasonPhrase("OK")
.Content(c => c
.Header("Content-Type", "application/json; charset=utf-8")
.Data(responseObject) // object to be JSON serialized
)
);
Use the fake response in a unit test
var serializer = new JsonContentSerializer();
// use memory store by default
var fakeHttp = new FakeMessageHandler();
var httpClient = new HttpClient(fakeHttp, true);
httpClient.BaseAddress = new Uri("https://api.github.com/", UriKind.Absolute);
var client = new FluentClient(httpClient, serializer);
// make HTTP call
var result = await client.GetAsync<Repository>(b => b
.AppendPath("repos")
.AppendPath("loresoft")
.AppendPath("FluentRest")
.Header(h => h.Authorization("token", "7ca..."))
);
Use fake handlers with HttpClientFactory
var services = new ServiceCollection();
services.AddSingleton<IContentSerializer, JsonContentSerializer>();
services.AddSingleton<IFakeMessageStore>(s => MemoryMessageStore.Current);
services
.AddHttpClient<EchoClient>(c => c.BaseAddress = new Uri("http://httpbin.org/"))
.AddHttpMessageHandler(s => new FakeMessageHandler(s.GetService<IFakeMessageStore>(), FakeResponseMode.Fake));
var serviceProvider = services.BuildServiceProvider();
// fake response object
var response = new EchoResult();
response.Url = "http://httpbin.org/post?page=10";
response.Headers["Accept"] = "application/json";
response.QueryString["page"] = "10";
response.Form["Test"] = "Fake";
response.Form["key"] = "value";
// setup fake response
MemoryMessageStore.Current.Register(b => b
.Url("http://httpbin.org/post?page=10")
.StatusCode(HttpStatusCode.OK)
.ReasonPhrase("OK")
.Content(c => c
.Header("Content-Type", "application/json; charset=utf-8")
.Data(response)
)
);
var client = serviceProvider.GetService<EchoClient>();
var result = await client.PostAsync<EchoResult>(b => b
.AppendPath("post")
.FormValue("Test", "Fake")
.FormValue("key", "value")
.QueryString("page", 10)
).ConfigureAwait(false);
FileMessageStore
The file message store allows saving an HTTP call response on the first use. You can then use that saved response for all future unit test runs.
Configure the FluentRest to capture response.
var serializer = new JsonContentSerializer();
// use file store to load from disk
var fakeStore = new FileMessageStore();
fakeStore.StorePath = @".\GitHub\Responses";
var fakeHttp = new FakeMessageHandler(fakeStore, FakeResponseMode.Capture);
var httpClient = new HttpClient(fakeHttp, true);
httpClient.BaseAddress = new Uri("https://api.github.com/", UriKind.Absolute);
var client = new FluentClient(httpClient, serializer);
var result = await client.GetAsync<Repository>(b => b
.AppendPath("repos")
.AppendPath("loresoft")
.AppendPath("FluentRest")
.Header(h => h.Authorization("token", "7ca..."))
);
Use captured response
var serializer = new JsonContentSerializer();
// use file store to load from disk
var fakeStore = new FileMessageStore();
fakeStore.StorePath = @".\GitHub\Responses";
var fakeHttp = new FakeMessageHandler(fakeStore, FakeResponseMode.Fake);
var httpClient = new HttpClient(fakeHttp, true);
httpClient.BaseAddress = new Uri("https://api.github.com/", UriKind.Absolute);
var client = new FluentClient(httpClient, serializer);
var result = await client.GetAsync<Repository>(b => b
.AppendPath("repos")
.AppendPath("loresoft")
.AppendPath("FluentRest")
.Header(h => h.Authorization("token", "7ca..."))
);
Change Log
Version 6.0
- [Breaking] Remove netstandard1.3 support
- add overload for generic AppendPath
- update dependence packages
Version 5.0
- [Breaking] Major refactor to support HttpClientFactory
- [Breaking]
FluentClient
changed to a light wrapper forHttpClient
- [Breaking] Removed
FluentClient.BaseUri
defaults, useHttpClient.BaseAddress
instead - [Breaking] Removed
FluentClient
default headers, useHttpClient
instead - [Breaking] All fluent builder take
HttpRequestMessage
instead ofFluentRequest
- [Breaking] Removed
FluentRequest
andFluentResponse
classes - [Breaking] Removed
FluentRequest.Create
fluent builder - [Breaking] Moved all Fake Response handlers to
FluentRest.Fake
Nuget Package - [Breaking] Removed interceptor support in favor of HttpClientFactory middleware handlers
- Add support for HttpClientFactory typed client and middleware handlers
- Add
FluentRequest.Factory
to support named FluentClient instances
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 is compatible. 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 is compatible. 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 is compatible. 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. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. 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.0
- FluentRest (>= 9.9.3)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 8.0.1)
- Microsoft.Extensions.Http (>= 8.0.0)
-
.NETStandard 2.1
- FluentRest (>= 9.9.3)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 8.0.1)
- Microsoft.Extensions.Http (>= 8.0.0)
-
net6.0
- FluentRest (>= 9.9.3)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 8.0.1)
- Microsoft.Extensions.Http (>= 8.0.0)
-
net7.0
- FluentRest (>= 9.9.3)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 8.0.1)
- Microsoft.Extensions.Http (>= 8.0.0)
-
net8.0
- FluentRest (>= 9.9.3)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 8.0.1)
- Microsoft.Extensions.Http (>= 8.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
10.0.0 | 74 | 11/13/2024 |
9.9.9 | 93 | 10/9/2024 |
9.9.8 | 96 | 8/8/2024 |
9.9.7 | 96 | 8/8/2024 |
9.9.6 | 107 | 8/8/2024 |
9.9.5 | 63 | 7/26/2024 |
9.9.4 | 109 | 6/5/2024 |
9.9.3 | 101 | 6/5/2024 |
9.9.2 | 92 | 5/1/2024 |
9.9.1 | 87 | 4/26/2024 |
9.9.0 | 128 | 3/3/2024 |
9.8.0 | 256 | 11/24/2023 |
9.7.0 | 179 | 7/28/2023 |
9.6.8 | 157 | 7/27/2023 |
9.0.320 | 17,132 | 4/23/2022 |
9.0.299 | 1,531 | 12/22/2021 |
9.0.295 | 400 | 12/3/2021 |
8.0.282 | 372 | 11/2/2021 |
8.0.281 | 415 | 10/30/2021 |
7.1.0.274 | 346 | 10/21/2021 |
7.1.0.240 | 565 | 2/15/2021 |
7.1.0.227 | 599 | 11/13/2020 |
7.1.0.216 | 455 | 10/26/2020 |
7.1.0.184 | 517 | 6/25/2020 |
7.1.0.183 | 492 | 6/25/2020 |
7.1.0.157 | 517 | 4/11/2020 |
7.1.0.132 | 738 | 1/24/2020 |
7.1.0.124 | 594 | 1/6/2020 |
7.0.0.98 | 562 | 9/24/2019 |
6.0.0.90 | 1,135 | 7/18/2019 |
6.0.0.86 | 696 | 1/23/2019 |
5.0.0.78 | 1,006 | 5/31/2018 |