本文是根据角落的白板报的《使用ABP实现SwaggerUI,生成动态webapi》一文的学习总结,感谢原文作者角落的白板报

1 安装Swashbuckle.core

1.1 选择WebApi项目,右键“管理NuGet程序包”。

1.2 输入 “Swashbuckle.core”,搜索。选择Swashbuckle.core,右边点击安装。

2 配置Swashbuckle

2.1 打开WebApi项目中的DemoWebApiModule.cs文件。创建ConfigureSwaggerUI()方法,并在Initialize()中调用。

public void ConfigureSwaggerUI()
{
    Configuration.Modules.AbpWebApi().HttpConfiguration
        .EnableSwagger(c =>
        {
            c.SingleApiVersion("v1", "DemoAPI文档");
            c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
        })
        .EnableSwaggerUi();
}
public override void Initialize()
{
    IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());

    Configuration.Modules.AbpWebApi().DynamicApiControllerBuilder
        .ForAll<IApplicationService>(typeof(DemoApplicationModule).Assembly, "app")
        .Build();

    Configuration.Modules.AbpWebApi().HttpConfiguration.Filters.Add(new HostAuthenticationFilter("Bearer"));

    ConfigureSwaggerUI();
}

2.2 运行项目。

运行项目,打开地址“/swagger/ui/index”,即可查看WebApi。

3 增强WebApi文档

3.1 打开Application项目的属性设置,勾选“XML文档文件”。

3.2 将application层中的注释添加到SwaggerUI中。

 public void ConfigureSwaggerUI()
 {
     Configuration.Modules.AbpWebApi().HttpConfiguration
         .EnableSwagger(c =>
         {
             c.SingleApiVersion("v1", "DemoAPI文档");
             c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());

             //将application层中的注释添加到SwaggerUI中
             var baseDirectory = AppDomain.CurrentDomain.BaseDirectory;

             var commentsFileName = "Bin//Demo.Application.xml";
             var commentsFile = Path.Combine(baseDirectory, commentsFileName);
             //将注释的XML文档添加到SwaggerUI中
             c.IncludeXmlComments(commentsFile);
         })
         .EnableSwaggerUi();
 }

3.3 在API接口方法中添加注释后,SwaggerUI就会显示对应的注释信息。以Role为例,添加注释如下:

UpdateRolePermissionsInput.cs

/// <summary>
/// 修改角色权限信息接收的DTO
/// </summary>
public class UpdateRolePermissionsInput
{
    /// <summary>
    /// 角色ID
    /// </summary>
    [Range(, int.MaxValue)]
    public int RoleId { get; set; }

    /// <summary>
    /// 获取权限名称列表
    /// </summary>
    [Required]
    public List<string> GrantedPermissionNames { get; set; }
}

IRoleAppService.cs

/// <summary>
/// 角色信息接口
/// </summary>
public interface IRoleAppService : IApplicationService
{
    /// <summary>
    /// 修改角色的权限信息
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    Task UpdateRolePermissions(UpdateRolePermissionsInput input);
}

3.4 再次运行项目,可以看到WebApi文档出现了注释信息。

4 修改访问方式

4.1 使用EnableSwaggerUi的重载方法。

SwaggerUI默认使用的是EnableSwaggerUi()方法,访问路径默认为“/swagger/ui/index/”。 F12转到定义,我们可以看到EnableSwaggerUi有一个重载方法。

public void EnableSwaggerUi(Action<SwaggerUiConfig> configure = null);
public void EnableSwaggerUi(string routeTemplate, Action<SwaggerUiConfig> configure = null);

ConfigureSwaggerUI中更改EnableSwaggerUi()为:

EnableSwaggerUi("apis/{*assetPath}");

4.2 更改后的访问路径变为"apis/index",运行程序,查看。

5 界面优化

5.1 调整界面CSS样式

(1)新建style.css样式文件,可以自定义文件名。

(2)style.css中编辑样式脚本,以下为示例:

.swagger-section #header {
    background-color: #ff6a00;
    padding: 14px;
}

(3)style.css文件属性设置为“嵌入的资源”。   非常重要!!!

(4)修改ConfigureSwaggerUI方法。

EnableSwaggerUi("apis/{*assetPath}", c=>
        {
            c.InjectStylesheet(Assembly.GetExecutingAssembly(),
                "Demo.SwaggerUI.css.style.css");
        });

其中,Demo为项目命名空间,Demo以后的为文件夹或文件。

(5)预览效果,可以看到header背景色由默认的绿色改为了橙色。

5.2 汉化

操作与5.1相似。

(1)新建swagger.js文件,可以自定义文件名。

(2)编辑swagger.js。

$(function () {

    $("#logo").text("Demo");
    $("#logo").attr("href", "http://www.Demo.com");

    $("#explore").text("查询");

    $(".options .toggleEndpointList").each(function () {
        $(this).text("展开/隐藏");
    });
    $(".options .collapseResource").each(function () {
        $(this).text("显示资源列表");
    });

    $(".options .expandResource").each(function () {
        $(this).text("显示资源明细");
    });

    $(".operations .description-link").each(function () {
        $(this).text("实体模型");
    });

    $(".operations .snippet-link").each(function () {
        $(this).text("实体类型");
    });

    $(".operations .response-content-type label").each(function () {
        $(this).text("请求方式");
    });
    $(".operations .sandbox h4").each(function () {
        $(this).text("参数列表");
    });

    $(".operations .response_hider").each(function () {
        $(this).text("隐藏响应界面");
    });
    $(".operations .response .curl").each(function () {
        $(this).text("请求头");
    });

    $(".operations .response .curl").each(function () {
        $(this).next().text("请求路径");
    });

    $(".response_body").each(function () {
        $(this).prev().text("响应正文");
    });

    $("[class='block response_code']").each(function () {
        $(this).prev().text("响应代码");
    });

    $("[class='block response_headers']").each(function () {
        $(this).prev().text("响应标头");
    });

    $(".parameter-content-type div label").each(function () {
        $(this).text("参数的内容类型︰");
    });

    $("small.notice").each(function () {
        $(this).text("单击要设置为参数值");
    });

    $(".body-textarea").each(function () {
        var op = $(this).attr("placeholder");

        if (op === "(required)") {
            $(this).attr("placeholder", "(不可为空)");
        }
    });

    $(".body-textarea required");

    $(".fullwidth thead tr th").each(function () {
        var key = $(this).text();
        switch (key) {
            case "Parameter":
                $(this).text("参数名");
                break;
            case "Value":
                $(this).text("参数值");
                break;
            case "Description":
                $(this).text("描述");
                break;
            case "Parameter Type":
                $(this).text("参数类型");
                break;
            case "Data Type":
                $(this).text("数据类型");
                break;

            default:
                break;
        }
    });

    $("input[type='submit']").val("测试");
})

其中,logo换成了文字“Demo”,logo的链接换成了“http://www.Demo.com”。可根据实际修改。

(3)swagger.js文件属性设置为“嵌入的资源”。

(4)修改ConfigureSwaggerUI方法。

EnableSwaggerUi("apis/{*assetPath}", c=>
        {
            c.InjectStylesheet(Assembly.GetExecutingAssembly(),
                "Demo.SwaggerUI.css.style.css");
            c.InjectJavaScript(Assembly.GetExecutingAssembly(),
                "Demo.SwaggerUI.script.swagger.js");
        });

其中,Demo为项目命名空间,Demo以后的为文件夹或文件。

(5)预览效果。

后记:

在整个过程中,我遇到的问题是,css文件和js文件设置未生效。琢磨了很久,根本原因是未设置文件属性为“嵌入的资源”!牢记这一步!

本节源码链接:http://pan.baidu.com/s/1nuZHJvz 密码:a0tu

 

ABP项目中使用Swagger生成动态WebAPI的更多相关文章

  1. .net WebApi中使用swagger生成WepApi集成测试工具

    我在WebApi中使用swagger的时候发现会出现很多问题,搜索很多地方都没找到完全解决问题的方法,后面自己解决了,希望对于遇到同样问题朋友有帮助.我将先一步一步的演示项目中解决swagger遇到问 ...

  2. ASP.NET Core 3.0 WebApi中使用Swagger生成API文档简介

    参考地址,官网:https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/getting-started-with-swashbuckle?view ...

  3. NetCore 3.0 中使用Swagger生成Api说明文档及升级报错原因

    认识Swagger Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务.总体目标是使客户端和文件系统作为服务器以同样的速度来更新.文件的方法,参 ...

  4. 如何在spring-boot web项目中启用swagger

    swagger的三个项目及其作用 我们打开swagger的官网,会发现有三个swagger相关的项目,它们分别是 swagger-editor 作用是通过写代码,生成文档描述(一个json文件或其他格 ...

  5. AutoMapper之ABP项目中的使用介绍

    最近在研究ABP项目,昨天写了Castle Windsor常用介绍以及其在ABP项目的应用介绍 欢迎各位拍砖,有关ABP的介绍请看阳光铭睿 博客 AutoMapper只要用来数据转换,在园里已经有很多 ...

  6. [Laravel-Swagger]如何在 Laravel 项目中使用 Swagger

    如何在 Laravel 项目中使用 Swagger http://swagger.io/getting-started/ 安装依赖 swagger-php composer require zirco ...

  7. ABP项目中的使用AutoMapper

    AutoMapper之ABP项目中的使用 最近在研究ABP项目,昨天写了Castle Windsor常用介绍以及其在ABP项目的应用介绍 欢迎各位拍砖,有关ABP的介绍请看阳光铭睿 博客 AutoMa ...

  8. ABP教程-给项目添加SwaggerUI,生成动态webapi

    上一篇,我们是正式将ABP生成的代码项目,跑起来了,然后演示了下多租户的不同.那么这篇我们就来实现下SwaggerUI. Q:SwaggerUI是干什么的呢? A:他是一个能将我们的webapi,通过 ...

  9. Android项目中JNI技术生成并调用.so动态库实现详解

    生成 jni方式有两种:一种是通过SWIG从C++代码生成过度的java代码:另一种是通过javah的方式从java代码自动生成过度的C++代码.两种方式下的步骤流程正好相反. 第一种方式:由于需要配 ...

随机推荐

  1. iframe用法

    <iframe src="http://caiyanli.top/" height="500"  width="500" frameb ...

  2. SQL Server-聚焦使用视图若干限制/建议、视图查询性能问题,你懵逼了?(二十五)

    前言 上一节我们简单讲述了表表达式的4种类型,这一系列我们来讲讲使用视图的限制,简短的内容,深入的理解,Always to review the basics. 避免在视图中使用ORDER BY 上一 ...

  3. 玩转spring boot——结合JPA入门

    参考官方例子:https://spring.io/guides/gs/accessing-data-jpa/ 接着上篇内容 一.小试牛刀 创建maven项目后,修改pom.xml文件 <proj ...

  4. web api接口同步和异步的问题

    一般来说,如果一个api 接口带上Task和 async 一般就算得上是异步api接口了. 如果我想使用异步api接口,一般的动机是我在我的方法里面可能使用Task.Run 进行异步的去处理一个耗时的 ...

  5. HTML5 Page Visibility

    什么是 Page Visibility ? Page Visibility 即页面可见性,通过 visibilityState 的值检测页面当前是否可见.当一个网站是可见或点击选中的状态时 Page ...

  6. Flex 布局教程:实例篇

    该教程整理自 阮一峰Flexible教程 今天介绍常见布局的Flex写法.你会看到,不管是什么布局,Flex往往都可以几行命令搞定. 我的主要参考资料是Landon Schropp的文章和Solved ...

  7. Android中AlarmManager使用示例(持续更新,已经更改)

    现在普遍的手机都会有一个闹钟的功能,如果使用Android来实现一个闹钟可以使用AtarmManager来实现.AtarmManager提供了一种系统级的提示服务,允许你安排在将来的某个时间执行一个服 ...

  8. MySQL+Amoeba实现数据库主从复制和读写分离

    MySQL读写分离是在主从复制的基础上进一步通过在master上执行写操作,在slave上执行读操作来实现的.通过主从复制,master上的数据改动能够同步到slave上,从而保持了数据的一致性.实现 ...

  9. HP服务器 hp 360g5 centos7安装问题

    HP服务器  hp 360g5 centos7安装问题 一 :启动盘无法识别硬盘 1.进入安装光盘,用上下键选择安装centos--Install Centos7(注意不可按Enter键),如图: 2 ...

  10. python-time 模块

    1.时间戳是以秒为单位的浮点小数,时间戳以自1970年1月1日午夜到现在经过了的时间来表示 2.时间模块引入方式:import time 3.返回时间戳 time.time() 4.返回时间元组:ti ...