Compass.NET
1.2.0
See the version list below for details.
dotnet add package Compass.NET --version 1.2.0
NuGet\Install-Package Compass.NET -Version 1.2.0
<PackageReference Include="Compass.NET" Version="1.2.0" />
paket add Compass.NET --version 1.2.0
#r "nuget: Compass.NET, 1.2.0"
// Install Compass.NET as a Cake Addin #addin nuget:?package=Compass.NET&version=1.2.0 // Install Compass.NET as a Cake Tool #tool nuget:?package=Compass.NET&version=1.2.0
Compass.NET
Simple HTTP request router for .NET backends
This documentation refers the v1.X of the library
How to use
This library comes with an extremely simple API set (consits of a few methods only)
Register the known routes
using System.Collections.Generic; using System.Net; using Solti.Utils.Router; RouterBuilder routerBuilder = new ( // This handler is called on every unknown routes handler: (object? state, HttpStatusCode reason) => { HttpListenerContext ctx = (HttpListenerContext) state; ... }, // can be omitted converters: DefaultConverters.Instance ); routerBuilder.AddRoute ( // A route may contain parameter(s) route: "/get/picture-{id:int}", handler: (IReadOnlyDictionary<string, object?> paramz, object? state) => { HttpListenerContext ctx = (HttpListenerContext) state; int id = (int) paramz["id"]; ... }, // "GET" is the default "GET", "OPTIONS" );
A valid route looks like
[/]segment1/[prefix]{paramName:converter[:style]}[suffix]/segment3[/]
Build the router delegate and start the HTTP backend
Router route = routerBuilder.Build(); HttpListener listener = new HttpListener(); listener.Prefixes.Add("http://localhost:8080/"); listener.Start(); ... while (Listener.IsListening) // probably this will run in a separate thread { HttpListenerContext context = Listener.GetContext(); route(context, context.Request.Url!.AbsolutePath, context.Request.HttpMethod); }
For a more comprehensive example check out the use cases fixture
Converters
Converters are used to parse variable value coming from the request path. Default converters (int
, guid
, str
and enum
) can be accessed via the DefaultConverters.Instance
property.
using System.Collections.Generic;
using Solti.Utils.Router;
RouterBuilder routerBuilder = new
(
defaultHandler: (object? state) => {...},
converters: new Dictionary<string, ConverterFactory>(DefaultConverters.Instance)
{
{"mytype", (string? style) => new MyConverter(style)}
}
);
class MyTypeConverter: IConverter
{
public string Id { get; }
public string? Style { get; }
public bool ConvertToValue(string input, out object? value) { ... }
public bool bool ConvertToString(object? input, out string? value) { ... }
public MyTypeConverter(string? style)
{
Id = $"{GetType().Name}:{style}";
Style = style;
}
}
Building routes from template
using System.Collections.Generic;
using Solti.Utils.Router;
RouteTemplateCompiler compile = RouteTemplate.CreateCompiler("http://localhost:8080/get/picture-{id:int}");
string route = compile(new Dictionary<string, object?> { { "id", 1986 } }); // route == "http://localhost:8080/get/picture-1986"
...
Advanced usage, async routing
In real world, request handlers often contain complex, async logic. AsyncRouterBuilder
is aimed to support this use case with an API set very similar to RouterBuilder
:
using System.Collections.Generic;
using System.Net;
using Solti.Utils.Router;
AsyncRouterBuilder routerBuilder = AsyncRouterBuilder.Create
(
handler: async (object? state, HttpStatusCode reason) =>
{
HttpListenerContext ctx = (HttpListenerContext) state;
await ...
},
// can be omitted
converters: DefaultConverters.Instance
);
routerBuilder.AddRoute
(
route: "/get/picture-{id:int}",
handler: async (IReadOnlyDictionary<string, object?> paramz, object? state) =>
{
HttpListenerContext ctx = (HttpListenerContext) state;
int id = (int) paramz["id"];
await ...
},
// "GET" is the default
"GET", "OPTIONS"
);
routerBuilder.AddRoute
(
route: "/",
// non-async callbacks also supported
handler: (IReadOnlyDictionary<string, object?> paramz, object? state) =>
{
...
}
);
AsyncRouter route = routerBuilder.Build();
...
HttpListenerContext context = Listener.GetContext();
object? result = await route(context, context.Request.Url!.AbsolutePath, context.Request.HttpMethod);
Resources
Supported frameworks
This project currently targets .NET Standard 2.0 and 2.1.
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. |
.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
- Solti.Utils.Primitives (>= 8.1.1)
-
.NETStandard 2.1
- Solti.Utils.Primitives (>= 8.1.1)
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 |
---|---|---|
6.0.1 | 77 | 8/4/2024 |
6.0.0 | 74 | 8/4/2024 |
5.0.5 | 109 | 5/22/2024 |
5.0.4 | 130 | 2/23/2024 |
5.0.3 | 120 | 2/8/2024 |
5.0.2 | 101 | 2/8/2024 |
5.0.1 | 109 | 2/8/2024 |
5.0.0 | 116 | 1/31/2024 |
4.0.3 | 117 | 1/25/2024 |
4.0.2 | 104 | 1/25/2024 |
4.0.1 | 104 | 1/23/2024 |
4.0.0 | 107 | 1/23/2024 |
3.0.0 | 162 | 1/9/2024 |
3.0.0-preview1 | 118 | 1/8/2024 |
2.0.1 | 160 | 12/29/2023 |
2.0.0 | 214 | 10/16/2023 |
1.2.1 | 142 | 9/18/2023 |
1.2.0 | 138 | 9/17/2023 |
1.1.1 | 127 | 9/15/2023 |
1.1.0 | 142 | 9/15/2023 |
1.0.0 | 147 | 9/13/2023 |
1.0.0-preview5 | 129 | 9/12/2023 |
1.0.0-preview4 | 137 | 9/5/2023 |
1.0.0-preview3 | 131 | 9/3/2023 |
1.0.0-preview2 | 124 | 8/25/2023 |
1.0.0-preview1 | 123 | 8/20/2023 |