API response consistency
The ApiResponseFilter
is an action filter attribute that provides consistent structure to API responses. It wraps the API response body within an ApiResponse
class.
/// <summary>
/// Api response
/// </summary>
public class ApiResponse
{
/// <summary>
/// Error messages
/// </summary>
public string[]? Errors { get; init; }
/// <summary>
/// Success flag
/// </summary>
public bool IsSuccess { get; init; }
/// <summary>
/// Response body
/// </summary>
public object? Data { get; init; }
/// <summary>
/// Status code
/// </summary>
public HttpStatusCode StatusCode { get; init; }
}
Model Validation
If the model state is invalid, the filter captures the errors and returns a structured error response with an HTTP status code of 400 Bad Request
.
Installation
dotnet add package Eiffel.CrossCutting.ApiResponseConsistency
You should install Eiffel.CrossCutting.ApiResponseConsistency NuGet package into your application.
Usage
To apply this filter, decorate your controllers or actions with [ApiResponseFilter]
.
[ApiResponseFilter]
public class BookingController : ControllerBase
{
[HttpPost]
[ProducesDefaultResponseType(typeof(ApiResponse))]
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(ApiResponse<CreateBookingResponse>))]
public async Task<CreateBookingResponse> PostAsync([FromBody] CreateBookingRequest request)
{
// Your implementation details..
}
}
To appy this filter to all controllers in your application, add to Mvc filters.
// Program.cs (.NET5 and above)
public static async Task Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// Applies api response filter for all controllers
builder.Services.AddControllers(options =>
{
options.Filters.Add<ApiResponseFilter>();
});
var app = builder.Build();
app.Run();
}
Disabling consistency for specific actions/controllers
If you don't want a particular action or controller to be wrapped with this consistency logic, decorate it with the DisableApiResponseConsistency
attribute.
[DisableApiResponseConsistency]
public class FileController : ControllerBase
{
[HttpPost]
public async Task PostAsync(IFormFile file)
{
// Your implementation details..
}
}
Last updated