![]() |
VOOZH | about |
dotnet add package HAL.Common --version 9.0.6
NuGet\Install-Package HAL.Common -Version 9.0.6
<PackageReference Include="HAL.Common" Version="9.0.6" />
<PackageVersion Include="HAL.Common" Version="9.0.6" />Directory.Packages.props
<PackageReference Include="HAL.Common" />Project file
paket add HAL.Common --version 9.0.6
#r "nuget: HAL.Common, 9.0.6"
#:package HAL.Common@9.0.6
#addin nuget:?package=HAL.Common&version=9.0.6Install as a Cake Addin
#tool nuget:?package=HAL.Common&version=9.0.6Install as a Cake Tool
A .NET 10 library for implementing the Hypertext Application Language (HAL) and HAL-Forms in web APIs and clients.
HAL is a standard for building discoverable, self-describing REST APIs using hypermedia links. This library helps you:
Use HAL if you want your API clients to discover available actions and related resources dynamically, following the HATEOAS principle.
This project provides:
HAL.Common which contains the Resource, Resource<T>, FormsResource, FormsResource<T> and Link implementations and the converters needed for serialization with System.Text.Json.HAL.AspNetCore adds IResourceFactory, IFormFactory and ILinkFactory which can be used in your controllers to easily generate resources from your models. It also comes with a HalControllerBase class which can be used for all Controllers which return HAL.HAL.AspNetCore.OData adds IODataResourceFactory and IODataFormFactory which can be used in your controllers to easily generate list endpoints with paging from OData $filter, $skip and $top syntax.HAL.Client.Net is a client library to consume HAL APIs in .NET applications. Call services.AddHalClient() to register IHalClient, or services.AddHalClientFactoy(clientNames) to register IHalClientFactory for named clients. ()HAL.Client.Angular / @wertzui/ngx-hal-client is a client library to consume HAL APIs in Angular applications. Call provideHalClient() in your app.config.ts providers to register HalClient and FormService. ()Add the desired package(s) via NuGet:
# Example for HAL.AspNetCore
dotnet add package HAL.AspNetCore
To use the Angular HAL client, install the npm package:
npm install @wertzui/ngx-hal-client
Use this approach for standard REST endpoints.
Configure services in Program.cs to enable HAL serialization:
builder.Services
.AddControllers()
.AddHAL();
AddHAL()already configures all required JSON options (converters,DefaultIgnoreCondition, etc.). You only need to callAddJsonOptionsafterwards if you want to customize settings beyond the defaults.
Return HAL resources from your controller:
[Route("[controller]")]
public class MyController : HalControllerBase
{
private readonly IResourceFactory _resourceFactory;
public MyController(IResourceFactory resourceFactory)
{
_resourceFactory = resourceFactory ?? throw new ArgumentNullException(nameof(resourceFactory));
}
[HttpGet]
[ApiConventionMethod(typeof(DefaultApiConventions), nameof(DefaultApiConventions.Get))]
public ActionResult<Resource> GetList()
{
var models = new[]
{
new MyModelListDto {Id = 1, Name = "Test1"},
new MyModelListDto {Id = 2, Name = "Test2"},
};
var result = _resourceFactory.CreateForListEndpoint(models, _ => "items", m => m.Id);
return Ok(result);
}
[HttpGet("{id}")]
public ActionResult<Resource<ModelFullDto>> Get(int id)
{
var model = new ModelFullDto { Id = id, Name = $"Test{id}", Description = "Very important!" };
var result = _resourceFactory.CreateForEndpoint(model);
return Ok(result);
}
// PUT, POST, ...
}
Use this approach if your API supports OData queries for filtering, paging, and sorting.
Configure services in Program.cs to enable OData and HAL:
builder.Services
.AddControllers(options => // or .AddMvc()
{
options.OutputFormatters.RemoveType<ODataOutputFormatter>();
options.InputFormatters.RemoveType<ODataInputFormatter>();
})
.AddOData()
.AddHALOData();
var app = builder.Build();
app.UseRouting();
// ...
app.UseEndpoints(_ => { });
app.MapControllers();
Return HAL resources with OData support from your controller:
[Route("[controller]")]
public class MyController : HalControllerBase
{
private readonly IODataResourceFactory _resourceFactory;
public MyController(IODataResourceFactory resourceFactory)
{
_resourceFactory = resourceFactory ?? throw new ArgumentNullException(nameof(resourceFactory));
}
[HttpGet]
[ApiConventionMethod(typeof(DefaultApiConventions), nameof(DefaultApiConventions.Get))]
public ActionResult<Resource<Page>> GetList(
// The SwaggerIgnore attribute and all parameters besides options are just here to give you a nice Swagger experience.
// If you do not need that, you can remove everything except the options parameter.
[SwaggerIgnore] ODataQueryOptions<MyModelListDto> options,
[FromQuery(Name = "$filter")] string? filter = default,
[FromQuery(Name = "$orderby")] string? orderby = default,
[FromQuery(Name = "$top")] long? top = default,
[FromQuery(Name = "$skip")] long? skip = default)
{
var models = new[]
{
new MyModelListDto { Id = 1, Name = "Test1" },
new MyModelListDto { Id = 2, Name = "Test2" },
};
// Apply the OData filtering
var filtered = options.ApplyTo(models.AsQueryable())
.Cast<MyModelListDto>()
.ToArray();
var result = _resourceFactory.CreateForODataListEndpointUsingSkipTopPaging(
filtered, _ => "items", m => m.Id, options.RawValues);
return Ok(result);
}
// GET, PUT, POST, ...
}
| Guide | Description |
|---|---|
| Full reference for the server-side library: resource factory, form factory, link factory, home endpoint, paging, HAL-Forms customization, and content negotiation. | |
| Deep-dive into how HAL-Forms templates are generated from C# types: attribute reference, type mapping, and custom generation hooks. | |
| Full reference for the .NET client library: registration, HTTP methods, link navigation, response handling, and HAL-Forms. | |
Full reference for the Angular client library: setup, HalClient API, FormService, SignalFormService, and date serialization. |
Contributions are welcome! Please open issues or submit pull requests.
This project is licensed under the Unlicense.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 net10.0 is compatible. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
Showing the top 3 NuGet packages that depend on HAL.Common:
| Package | Downloads |
|---|---|
|
HAL.AspNetCore
Package Description |
|
|
RESTworld.Common
Package Description |
|
|
HAL.Client.Net
Package Description |
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 9.0.6 | 132 | 5/31/2026 |
| 9.0.5 | 386 | 3/12/2026 |
| 9.0.4 | 273 | 3/10/2026 |
| 9.0.3 | 335 | 2/10/2026 |
| 9.0.2 | 201 | 2/9/2026 |
| 9.0.1 | 558 | 12/15/2025 |
| 9.0.0 | 932 | 11/11/2025 |
| 8.3.1 | 385 | 11/9/2025 |
| 8.3.0 | 331 | 11/9/2025 |
| 8.2.0 | 612 | 6/19/2025 |
| 8.1.0 | 569 | 3/17/2025 |
| 8.0.0 | 784 | 11/20/2024 |
| 7.1.1 | 3,311 | 10/11/2024 |
| 7.1.0 | 514 | 9/27/2024 |
| 7.0.0 | 1,032 | 7/2/2024 |
| 6.0.0 | 1,223 | 6/4/2024 |
| 5.2.0 | 1,152 | 1/9/2024 |
| 5.1.0 | 514 | 12/22/2023 |
| 5.0.0 | 1,113 | 11/14/2023 |
| 4.1.0 | 679 | 10/23/2023 |