FluentRest 10.0.0

dotnet add package FluentRest --version 10.0.0                
NuGet\Install-Package FluentRest -Version 10.0.0                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="FluentRest" Version="10.0.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add FluentRest --version 10.0.0                
#r "nuget: FluentRest, 10.0.0"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install FluentRest as a Cake Addin
#addin nuget:?package=FluentRest&version=10.0.0

// Install FluentRest as a Cake Tool
#tool nuget:?package=FluentRest&version=10.0.0                

FluentRest

Lightweight fluent wrapper over HttpClient to make REST calls easier

Build status

NuGet Version

Coverage Status

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 for HttpClient
  • [Breaking] Removed FluentClient.BaseUri defaults, use HttpClient.BaseAddress instead
  • [Breaking] Removed FluentClient default headers, use HttpClient instead
  • [Breaking] All fluent builder take HttpRequestMessage instead of FluentRequest
  • [Breaking] Removed FluentRequest and FluentResponse 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 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 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.  net9.0 is compatible. 
.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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (2)

Showing the top 2 NuGet packages that depend on FluentRest:

Package Downloads
FluentRest.NewtonsoftJson

Fluent wrapper over HttpClient to make REST calls easier

FluentRest.Factory

Fluent wrapper over HttpClient to make REST calls easier

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
10.0.0 970 11/13/2024
9.9.9 905 10/9/2024
9.9.8 1,343 8/8/2024
9.9.7 189 8/8/2024
9.9.6 189 8/8/2024
9.9.5 685 7/26/2024
9.9.4 1,275 6/5/2024
9.9.3 183 6/5/2024
9.9.2 1,598 5/1/2024
9.9.1 268 4/26/2024
9.9.0 2,647 3/3/2024
9.8.0 4,162 11/24/2023
9.7.0 2,243 7/28/2023
9.6.8 1,562 7/27/2023
9.0.320 48,258 4/23/2022
9.0.299 10,760 12/22/2021
9.0.295 781 12/3/2021
8.0.282 1,324 11/2/2021
8.0.281 818 10/30/2021
7.1.0.274 2,107 10/21/2021
7.1.0.240 5,360 2/15/2021
7.1.0.227 7,413 11/13/2020
7.1.0.216 921 10/26/2020
7.1.0.184 5,672 6/25/2020
7.1.0.183 852 6/25/2020
7.1.0.157 63,300 4/11/2020
7.1.0.132 6,904 1/24/2020
7.1.0.124 2,382 1/6/2020
7.0.0.98 7,040 9/24/2019
6.0.0.90 4,505 7/18/2019
6.0.0.86 4,430 1/23/2019
5.0.0.78 48,196 5/31/2018
4.0.0.72 17,507 5/30/2018
4.0.0.54 1,492 5/3/2018
4.0.0.51 1,834 3/22/2018
4.0.0.41 8,055 9/14/2017
4.0.0.40 1,109 9/13/2017
4.0.0.37 1,148 9/6/2017
3.0.0.33 22,811 4/12/2017
3.0.0.32 1,254 4/12/2017
2.0.0.31 2,090 8/15/2016
2.0.0.29 1,213 6/29/2016
2.0.0.26 1,194 6/29/2016
1.5.0.21 2,084 3/3/2016
1.5.0.20 1,197 3/2/2016
1.4.0.19 1,290 2/18/2016
1.3.0.16 1,301 1/29/2016
1.2.0.13 1,971 9/29/2015
1.2.0.12 1,385 9/15/2015
1.1.0.11 1,313 9/11/2015
1.1.0.10 1,294 9/10/2015
1.0.0.6 1,609 7/21/2015
1.0.0.5 1,282 7/21/2015
1.0.0.4 1,305 7/20/2015