Last active
March 6, 2022 04:20
-
-
Save DamianEdwards/cd6ab8865e9a0804c40f5a56d91c63af to your computer and use it in GitHub Desktop.
Endpoint Groups
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
app.MapGroup("/apis", apis => | |
{ | |
apis.UseExceptionHandler("/error"); | |
var problemJsonMediaType = new MediaTypeHeaderValue("application/problem+json"); | |
apis.MapGet("/error", (HttpContext context) => | |
{ | |
// Get exception details | |
var error = context.Features.Get<IExceptionHandlerFeature>()?.Error; | |
var badRequestEx = error as BadHttpRequestException; | |
var statusCode = badRequestEx?.StatusCode ?? StatusCodes.Status500InternalServerError; | |
// Return JSON if client supports it | |
if (context.Request.GetTypedHeaders().Accept?.Any(h => problemJsonMediaType.IsSubsetOf(h)) == true) | |
{ | |
var extensions = new Dictionary<string, object> { { "requestId", Activity.Current?.Id ?? context.TraceIdentifier } }; | |
// JSON Problem Details | |
return error switch | |
{ | |
BadHttpRequestException ex => Results.Extensions.Problem(detail: ex.Message, statusCode: ex.StatusCode, extensions: extensions), | |
_ => Results.Extensions.Problem(extensions: extensions) | |
}; | |
} | |
// Just return plain text | |
return Results.Extensions.StatusCode(statusCode, badRequestEx?.Message ?? "An unhandled exception occurred while processing the request."); | |
}) | |
.ExcludeFromDescription(); | |
apis.MapGroup("/samples", sampleApis => | |
{ | |
sampleApis.UseMiddleware<MyMiddleware>(); | |
sampleApis.MapGet("/hello", () => "Hello, World!"); | |
}) | |
.WithTags("Samples"); | |
apis.MapGroup("/todos", todoApis => | |
{ | |
todoApis.MapGet(async (TodoDb db) => | |
{ | |
return await db.Todos.ToListAsync(); | |
}); | |
todoApis.MapGet("{id}", async (int id, TodoDb db) => | |
{ | |
return await db.Todos.FindAsync(id); | |
}); | |
todoApis.MapPost(async (Todo todo, TodoDb db) => | |
{ | |
db.Todos.Add(todo); | |
await db.SaveChangesAsync(); | |
return Results.Created($"{todoApis.GroupPrefix}/{todo.Id}", todo); | |
}); | |
}) | |
.WithTags("Todos"); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment