Browse Source

Add `AbpNoContentApiDescriptionProvider` to handle NoContent responses

Introduces a custom API description provider to automatically add 204 No Content response types for remote service actions returning Task or void, improving API documentation accuracy.

Resolve #24647
pull/24656/head
maliming 3 weeks ago
parent
commit
dd2ee0ccc6
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 48
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApiExploring/AbpNoContentApiDescriptionProvider.cs

48
framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ApiExploring/AbpNoContentApiDescriptionProvider.cs

@ -0,0 +1,48 @@
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Reflection;
namespace Volo.Abp.AspNetCore.Mvc.ApiExploring;
public class AbpNoContentApiDescriptionProvider : IApiDescriptionProvider, ITransientDependency
{
public void OnProvidersExecuted(ApiDescriptionProviderContext context)
{
}
/// <summary>
/// The order -999 ensures that this provider is executed right after the
/// Microsoft.AspNetCore.Mvc.ApiExplorer.DefaultApiDescriptionProvider.
/// </summary>
public int Order => -999;
public void OnProvidersExecuting(ApiDescriptionProviderContext context)
{
foreach (var result in context.Results.Where(x => x.IsRemoteService()))
{
var actionProducesResponseTypeAttributes =
ReflectionHelper.GetAttributesOfMemberOrDeclaringType<ProducesResponseTypeAttribute>(
result.ActionDescriptor.GetMethodInfo());
if (actionProducesResponseTypeAttributes.Any(x => x.StatusCode == (int) HttpStatusCode.NoContent))
{
continue;
}
var returnType = result.ActionDescriptor.GetReturnType();
if (returnType == typeof(Task) || returnType == typeof(void))
{
result.SupportedResponseTypes.Add(new ApiResponseType
{
// If the return type is Task, then we should treat it as a void return type since we can't infer anything without additional metadata or requiring unreferenced code.
Type = typeof(void),
StatusCode = (int) HttpStatusCode.NoContent
});
}
}
}
}
Loading…
Cancel
Save