ReqHub 3.0.0

dotnet add package ReqHub --version 3.0.0
NuGet\Install-Package ReqHub -Version 3.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="ReqHub" Version="3.0.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add ReqHub --version 3.0.0
#r "nuget: ReqHub, 3.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 ReqHub as a Cake Addin
#addin nuget:?package=ReqHub&version=3.0.0

// Install ReqHub as a Cake Tool
#tool nuget:?package=ReqHub&version=3.0.0

ReqHubDotNet

ReqHub middleware for C# projects. Distribute your API using the ReqHub platform in just a few lines! For more information, visit https://reqhub.io.

Installation

ReqHub for .Net is available on NuGet: https://www.nuget.org/packages/ReqHub

Install-Package ReqHub

Distributing an API

To distribute an API for clients to consume with API keys, add these two lines to your Startup.cs:

/// Startup.cs

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // Visit https://reqhub.io to get your API keys
        services.AddReqHub("yourPublicKey", "yourPrivateKey");
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        // ...
        // app.UseRouting();
        
        // Put this after app.UseRouting() and before app.UseEndpoints().
        // It verifies requests against the platform and either
        // continues execution or returns a 403 forbidden response
        // if the request is invalid (bad API key, contents tampered with, etc.)
        app.UseReqHub();
        
        // app.UseEndpoints(...);
        // ...
    }
}

That's it! 🎉

How it works

Clients consuming your API create a request hash using their own API keys, which the middleware forwards to the platform along with your request hash. If everything matches up on the platform, the request is allowed to continue.

Consuming an API

To consume an API, configure a client and inject it into your controllers/services.

/// Startup.cs

public class Startup
{
    // ...
    
    public void ConfigureServices(IServiceCollection services)
    {
        // Visit https://reqhub.io to get your API keys
        services.AddApiClient("https://api-base-address", "yourClientPublicKey", "yourClientPrivateKey", "serviceName");
        
        // Add as many as you like!
        services.AddApiClient("https://api2-base-address", "anotherClientPublicKey", "anotherClientPrivateKey", "serviceName2");
    }
}

(it looks like a lot of code, but we promise it isn't 👌):

/// ExampleController.cs

public class ExampleController : ControllerBase
{
    private readonly IApiClient exampleApiClient;

    // Resolve the API client using dependency injection
    public ExampleController(ApiClientResolver apiClientResolver)
    {
        this.exampleApiClient = apiClientResolver("serviceName");
    }

    [HttpGet]
    public async Task<IEnumerable<Example>> Get()
    {
        return await this.exampleApiClient.GetAsync<IEnumerable<Example>>("/example/endpoint");
    }
}

.NET Framework

For those of you not using .NET Core, ReqHub supports .NET Framework (4.5+) WebApi projects.

/// FilterConfig.cs

public class FilterConfig
{
    public static void RegisterGlobalFilters(HttpFilterCollection filters)
    {
        // ...
        filters.Add(new ReqHubAttribute("yourPublicKey", "yourPrivateKey"));
    }
}

To consume an API:

// A little bit of setup
// (note that the HttpClient should be instantiated once and reused throughout the life of the application https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclient?view=netcore-3.1#remarks)
var httpClient = HttpClientFactory.Create(new ReqHubClientHttpMessageHandler("yourClientPublicKey", "yourClientPrivateKey"));
httpClient.BaseAddress = new Uri("https://api-base-address");
var exampleApiClient = new ApiClient(httpClient);

await this.exampleApiClient.GetAsync<IEnumerable<Example>>("/example/endpoint");

Per-endpoint configuration

ReqHub can be configured on a per-endpoint or per-controller basis. This is useful if you only want to publish a portion of your API, or if you want to include multiple small APIs in a single server instance to reduce hosting costs.

Simply apply the ReqHub attribute and you're all set!

// ReqHub attribute on a single action method

[HttpGet("test")]
[ReqHub(publicKey: "yourPublicKey", privateKey: "yourPrivateKey")]
public IActionResult Test()
{
    return this.Ok("Success!");
}

Placing the attribute at the controller level will apply to all its endpoints:

// ReqHub attribute on a controller

[Route("example")]
[ApiController]
[ReqHub(publicKey: "yourPublicKey", privateKey: "yourPrivateKey")]
public class ExampleController : ControllerBase
{
    [HttpGet("test1")]
    public IActionResult Test1()
    {
        return this.Ok("Success!");
    }
        
    [HttpGet("test2")]
    public IActionResult Test2()
    {
        return this.Ok("Success!");
    }
}

The examples here were for the latest .Net, but the same applies to .Net Framework projects.

Plan information

Plan information can be accessed from the User object. You can use this data to change or restrict functionality by plan.

this.User.GetClientId();           // A clientId unique to the user
this.User.GetPlanName();           // The plan name as entered, like "Extra awesome"
this.User.GetNormalizedPlanName(); // The plan name whitespace and special characters removed, like "Extra-awesome"
this.User.GetPlanSku();            // The plan SKU as entered, like "Extra awesome SKU!!!"
this.User.GetNormalizedPlanSku();  // The plan SKU with whitespace and special characters removed, like "Extra-awesome-SKU"
this.User.IsTrial();               // Indicates whether the user is currently in a trial period

Check out our docs for testing pricing plans for more information.

Contributing

Go for it! If we're missing something or you're running into a problem, either let us know in an issue or send us a pull request. We think we're pretty reasonable 😘

License

MIT, babe -- go nuts! 🎉

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 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. 
.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 was computed. 
.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

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
3.0.0 329 12/12/2021
2.3.0 394 11/23/2020
2.2.0 436 10/4/2020
2.1.4 415 8/14/2020
2.1.3 415 7/6/2020
2.1.2 443 7/6/2020
2.1.1 443 7/5/2020
2.1.0 444 7/2/2020
1.2.2 445 6/24/2020
1.2.1 401 6/19/2020
1.2.0 389 4/22/2020
1.1.3 429 3/27/2020
1.1.2 416 2/25/2020