A simple implementation of HATEOAS for .NET Web API to apply semantic links in models returned from your API.
See samples for more details about using: https://github.com/RonildoSouza/Simple.Hateoas/tree/master/samples
dotnet add package Simple.Hateoas --version 2.0.0
public class Startup
{
// ...
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddSimpleHateoas();
}
// ...
}
/// Program.cs
// ...
builder.Services.AddSimpleHateoas();
// ...
using Simple.Hateoas.Models;
using YourProject.Dtos
namespace YourProject.HateoasLinkBuilders
{
public class EntityDtoHateoasLinkBuilder : IHateoasLinkBuilder<EntityDto>
{
private readonly IPermissionServiceMock _permissionServiceMock;
public EntityDtoHateoasLinkBuilder(IPermissionServiceMock permissionServiceMock)
{
_permissionServiceMock = permissionServiceMock;
}
public HateoasResult<EntityDto> AddLinks(HateoasResult<EntityDto> hateoasResult)
{
hateoasResult
.AddSelfLink("GetEntity", c => new { id = c.Id })
.AddLink("DeleteEntity", HttpMethod.Delete, c => new { id = c.Id }, _ => _permissionServiceMock.UserLoggedIsAdmin());
return hateoasResult;
}
}
}
using Microsoft.AspNetCore.Mvc;
using YourProject.Dtos;
using YourProject.HateoasLinkBuilders;
namespace YourProject.Controllers
{
[ApiController]
[Route("[controller]")]
public class EntitiesController : ControllerBase
{
private readonly IEntityAppServiceMock _entityAppServiceMock;
private readonly IHateoas _hateoas;
public EntitiesController(IHateoas hateoas, IEntityAppServiceMock entityAppServiceMock)
{
_hateoas = hateoas;
_entityAppServiceMock = entityAppServiceMock;
}
[HttpGet("{id}", Name = "GetEntity")]
[ProducesResponseType(typeof(HateoasResult<EntityDto>), (int)HttpStatusCode.OK)]
public IActionResult Get(Guid id)
{
var entityDto = _entityAppServiceMock.GetById(id);
var hateoasResult = _hateoas.Create(entityDto);
return Ok(hateoasResult);
}
[HttpDelete("{id}", Name = "DeleteEntity")]
[ProducesResponseType((int)HttpStatusCode.OK)]
public IActionResult Delete(Guid id)
{
_entityAppServiceMock.RemoveById(id);
return Ok();
}
}
}
app.MapGet("/{id}", (
[FromServices] IHateoas hateoas,
[FromRoute] inGuidt id) =>
{
var entityDto = _entityAppServiceMock.GetById(id);
var hateoasResult = hateoas.Create(entityDto);
return Results.Ok(hateoasResult);
})
.WithName("GetEntity")
.Produces<HateoasResult<EntityDto>>(StatusCodes.Status200OK)
.WithOpenApi();
app.MapDelete("/{id}", ([FromRoute] Guid id) =>
{
_entityAppServiceMock.RemoveById(id);
return Results.Ok();
})
.WithName("DeleteEntity")
.Produces(StatusCodes.Status200OK)
.WithOpenApi();