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>publicclassApiResponse{ ///<summary> /// Error messages ///</summary>publicstring[]?Errors{get;init;} ///<summary> /// Success flag ///</summary>publicboolIsSuccess{get;init;} ///<summary> /// Response body ///</summary>publicobject?Data{get;init;} ///<summary> /// Status code ///</summary>publicHttpStatusCodeStatusCode{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
You should install Eiffel.CrossCutting.ApiResponseConsistency NuGet package into your application.
Usage
To apply this filter, decorate your controllers or actions with [ApiResponseFilter].
For better experience decorate your methodProducesDefaultResponseTypeandProducesResponseTypeby using ApiResponse and ApiResponse<T> classes.
To appy this filter to all controllers in your application, add to Mvc filters.
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.
[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..
}
}
// 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();
}
[DisableApiResponseConsistency]
public class FileController : ControllerBase
{
[HttpPost]
public async Task PostAsync(IFormFile file)
{
// Your implementation details..
}
}