Sciensoft.Hateoas
3.2.0
dotnet add package Sciensoft.Hateoas --version 3.2.0
NuGet\Install-Package Sciensoft.Hateoas -Version 3.2.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="Sciensoft.Hateoas" Version="3.2.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Sciensoft.Hateoas --version 3.2.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: Sciensoft.Hateoas, 3.2.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 Sciensoft.Hateoas as a Cake Addin #addin nuget:?package=Sciensoft.Hateoas&version=3.2.0 // Install Sciensoft.Hateoas as a Cake Tool #tool nuget:?package=Sciensoft.Hateoas&version=3.2.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
Please visit Sciensoft.Hateoas project at GitHub for more details and full documentation.
Features
- Collections result with links,
- Json.NET and System.Text.Json settings support,
- Self-link generation,
- Named Route link generation,
- Custom link generation with support to path override,
- External links configuration,
- Configuration with Lambda Expression,
- Attribute Routing support, and
- Conventional Routing support.
Roadmap
- Add support for extending link generation.
- Add support to bypass model link generation.
- Add support to .NET Authorization.
- Add support to Content Negotiation type in the read-model.
Get Started
Sciensoft.Hateoas gets installed using Nuget package manager.
Install-Package Sciensoft.Hateoas
Or dotnet CLI dotnet add package Sciensoft.Hateoas
.
Configuration
Using a fluent language, allows you to easily configure by adding the service to .NET Core dependency injection pipeline.
public void ConfigureServices(IServiceCollection services)
{
services
.AddMvc()
.AddLinks(policy =>
{
policy
.AddPolicy<BookViewModel>(model =>
{
model
.AddSelf(m => m.Id, "This is a GET self link.")
.AddRoute(m => m.Id, BookController.UpdateBookById)
.AddRoute(m => m.Id, BookController.DeleteBookById)
.AddCustomPath(m => m.Id, "Edit", method: HttpMethods.Post, message: "Edits resource")
.AddCustomPath(m => $"/change/resource/state/?id={m.Id}", "ChangeResourceState", method: HttpMethods.Post, message: "Any operation in your resource.")
.AddExternalUri(m => m.Id, "https://my-domain.com/api/books/", "Custom Domain External Link")
.AddExternalUri(m => $"/search?q={m.Title}", "https://google.com", "Google Search External Links", message: "This will do a search on Google engine.");
});
});
}
Here is how your controller looks like, no additional injection or attribute decoration is required. Please check our Sample Project out!
[Route("api/books")]
public class BookController : ControllerBase
{
public const string UpdateBookById = nameof(UpdateBookById);
public const string DeleteBookById = nameof(DeleteBookById);
[HttpGet]
public ActionResult<IEnumerable<BookViewModel>> Get()
{ /* Code omitted for simplicity */ }
[HttpGet("{id:guid}")]
public ActionResult<BookViewModel> Get(Guid id)
{ /* Code omitted for simplicity */ }
[HttpPost]
public IActionResult Post([FromBody] BookViewModel book)
{ /* Code omitted for simplicity */ }
[HttpPut("{id:guid}", Name = UpdateBookById)]
public IActionResult Put(Guid id, [FromBody] BookViewModel book)
{ /* Code omitted for simplicity */ }
[HttpDelete("{id:guid}", Name = DeleteBookById)]
public IActionResult Delte(Guid id)
{ /* Code omitted for simplicity */ }
}
JSON Result:
{
"Id": "8f46d29e-6c0d-4511-85e7-b1d7ae42934a",
"Title": "The Girl Who Lived: A Thrilling Suspense Novel",
"Author": "Christopher Greyson",
"Tags": [
"Fiction",
"Crime",
"Murder",
"Thriller"
],
"Reference": null,
"links": [
{
"method": "GET",
"uri": "http://localhost:6080/api/books/83389205-b1c9-4523-a3bb-85d7255546f9",
"relation": "Self",
"message": "This is a GET self link."
},
{
"method": "PUT",
"uri": "http://localhost:6080/api/books/83389205-b1c9-4523-a3bb-85d7255546f9",
"relation": "UpdateBookById",
"message": null
},
{
"method": "DELETE",
"uri": "http://localhost:6080/api/books/83389205-b1c9-4523-a3bb-85d7255546f9",
"relation": "DeleteBookById",
"message": null
},
{
"method": "POST",
"uri": "http://localhost:6080/api/books/83389205-b1c9-4523-a3bb-85d7255546f9",
"relation": "Edit",
"message": "Edits resource"
},
{
"method": "POST",
"uri": "http://localhost:6080/change/resource/state/%3fid=83389205-b1c9-4523-a3bb-85d7255546f9",
"relation": "ChangeResourceState",
"message": "Any operation in your resource."
},
{
"method": "GET",
"uri": "https://my-domain.com/api/books/83389205-b1c9-4523-a3bb-85d7255546f9",
"relation": "Custom Domain External Link",
"message": null
},
{
"method": "GET",
"uri": "https://google.com/search?q=The Girl Beneath the Sea (Underwater Investigation Unit Book 1)",
"relation": "Google Search External Links",
"message": "This will do a search on Google engine."
}
]
}
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 | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.1 is compatible. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | 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.
-
.NETStandard 2.1
- Microsoft.AspNetCore.Mvc.Core (>= 2.2.5)
- Microsoft.AspNetCore.Mvc.Formatters.Json (>= 2.2.0)
- Microsoft.Extensions.Caching.Abstractions (>= 3.1.3)
- System.Text.Json (>= 4.7.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.