Meowv / Blog

🤣本项目有不同开发版本,最新版底层基于 abp vNext 搭建和免费开源跨平台框架 .NET5 进行开发,使用 MongoDB 存储数据,Redis 缓存数据。项目采用前后端分离的模式进行开发,API 遵循 RESTful 接口规范,页面使用 Blazor 进行开发,可作为 .NET Core 入门项目进行学习。If you liked `Blog` project or if it helped you, please give a star ⭐️ for this repository. 👍👍👍
https://meowv.com
MIT License
1.28k stars 281 forks source link

swagger添加描述过滤不属于同一个分组的api #8

Closed SanchoWalden closed 4 years ago

SanchoWalden commented 4 years ago

1590199454(1)

swagger添加描述后,把不属于同一个分组的helloworld过滤掉怎么实现呢

Meowv commented 4 years ago

你好,经过研究是可以实现的,参考代码:

实现添加自定义描述时过滤不属于同一个分组的API

            #region 实现添加自定义描述时过滤不属于同一个分组的API

            // 当前分组名称
            var groupName = context.ApiDescriptions.FirstOrDefault().GroupName;

            // 当前所有的API对象
            var apis = context.ApiDescriptions.GetType().GetField("_source", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(context.ApiDescriptions) as IEnumerable<ApiDescription>;

            // 不属于当前分组的所有Controller
            // 注意:配置的OpenApiTag,Name名称要与Controller的Name对于才会生效。
            var controllers = apis.Where(x => x.GroupName != groupName).Select(x => ((ControllerActionDescriptor)x.ActionDescriptor).ControllerName).Distinct();

            // 筛选一下tags
            swaggerDoc.Tags = tags.Where(x => !controllers.Contains(x.Name)).OrderBy(x => x.Name).ToList();

            #endregion
SanchoWalden commented 4 years ago

@Meowv Thx.这是很棒的解决方案。

SamuelLiDR commented 3 years ago

您好,楼主;为什么我这边继承了IDocumentFilter 后;但是还是无法实现分组;所有分组显示的都是所有的接口API?

Meowv commented 3 years ago

您好,楼主;为什么我这边继承了IDocumentFilter 后;但是还是无法实现分组;所有分组显示的都是所有的接口API?

注意看看是否应用 https://github.com/Meowv/Blog/blob/master/src/Meowv.Blog.Swagger/MeowvBlogSwaggerExtensions.cs#L115

SamuelLiDR commented 3 years ago

@Meowv 已经都应用了,我也下载你的源码看过了基本上都有了~

    /// <summary>
    /// 对应Controller的API文档描述信息
    /// </summary>
    public class SwaggerDocumentFilter : IDocumentFilter
    {
        public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
        {
            var tags = new List<OpenApiTag>
            {
                new OpenApiTag {
                    Name = "Auth",
                    Description = "JWT模式认证授权",
                    ExternalDocs = new OpenApiExternalDocs { Description = "JSON Web Token" }
                }
            };
        ..................
         }

上面代码的 swaggerDoc ,我调试你的源码在切换分支的时候你这个地方就就已经将API切分了;而我的代码调试下来这个地方就是所有的没有切分

        /// <summary>
        /// 获取文章详情
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpGet]
        [Authorize]
        [Route("admin/post")]
        [Route("post/admin")]
        [ApiExplorerSettings(GroupName = Grouping.GroupName_v2)]
        public async Task<ServiceResult<PostForAdminDto>> GetPostForAdminAsync([Required] int id)
        {
            return await _blogService.GetPostForAdminAsync(id);
        }

这种的APIExplorer 处理了 并且也查看过控制器与配置中的一致。也对你了你的代码基本上都有的都有了;但是不同版本就是无法切换,每个版本显示的都是所有的API

Meowv commented 3 years ago

@SamuelLiDR 建议仔细检查对比我的代码并调试

SanchoWalden commented 3 years ago

@SamuelLiDR 这段代码,OpenApiTag的Name是需要和Controller的name对应的~~~

            new OpenApiTag {
                Name = "Auth",
                Description = "JWT模式认证授权",
                ExternalDocs = new OpenApiExternalDocs { Description = "JSON Web Token" }
            }