以目前流行的前后端分离模式来看,ABP框架更适用于后端开发,而对API接口的管理就成了一项必不可少的功能。


1.安装Swashbuckle.AspNetCore

使用Nuget管理器在分布式服务层和展现层AbpDemo.Web安装Swashbuckle.AspNetCore程序包,包含Swashbuckle.AspNetCore.Swagger、Swashbuckle.AspNetCore.SwaggerGen、Swashbuckle.AspNetCore.SwaggerUI三项。

2.配置Swagger选项

对于Swagger的配置主要是在AbpDemo.Web项目中的Startup启动类。
在ConfigureServices方法中添加配置:

            services.AddSwaggerGen(options =>{options.SwaggerDoc("v1", new OpenApiInfo { Title = "AbpDemo", Version = "v1.0",Description="",TermsOfService=new Uri("https://github.com/ludewig"),Contact = new OpenApiContact { Name="ludewig",Email="panshuairg@hotmail.com",Url=new Uri("https://github.com/ludewig") }});options.DocInclusionPredicate((docName, description) => true);});

在Configure方法中添加配置:

            app.UseSwagger();app.UseSwaggerUI(options =>{options.SwaggerEndpoint("/swagger/v1/swagger.json", "Demo API v1");});

此时启动项目,输入默认地址http://xxx:xx/swagger/index.html就可以访问swagger的API接口管理界面。

3.添加注释信息

但是现在界面包含的信息还比较少,在代码中的注释还没加进来。
打开应用层AbpDemo.Application的属性界面,选择“生成”选项,勾选“XML文档文件”,这样再次编译项目时,代码注释会以XML文件形式生成到AbpDemo.Web项目中。

同时还要在AbpDemo.Web项目中修改Startup启动类以便于Swagger能够读取到生成的XML文件。

            services.AddSwaggerGen(options =>{options.SwaggerDoc("v1", new OpenApiInfo { Title = "AbpDemo", Version = "v1.0",Description="",TermsOfService=new Uri("https://github.com/ludewig"),Contact = new OpenApiContact { Name="ludewig",Email="panshuairg@hotmail.com",Url=new Uri("https://github.com/ludewig") }});options.DocInclusionPredicate((docName, description) => true);var filePath = Path.Combine(AppContext.BaseDirectory, "AbpDemo.Application.xml");options.IncludeXmlComments(filePath);});

4.使用API接口管理界面

经过上面的配置步骤后再次启动项目,可以查看到swagger的界面了。

通过swagger的API管理界面,可以对API接口的输入输出数据结构进行查看和测试。

5.ABP框架中Swagger的其他配置

5.1关于CSRF

按照前面的步骤完成对Swagger的配置后,启动项目,测试接口却发现报错了。这其实是ABP框架本身的机制导致的。ABP框架默认是开启CSRF保护的,也就是启动了对Cross-Site Request Forgery (CSRF) 跨站请求伪造的防护机制,客户端必须携带可信的token令牌才能访问API接口。解决这个问题有两种方式:

  1. 关闭CSRF保护
    在Startup启动类的ConfigureServices方法中注释如下代码
            services.AddControllersWithViews(options =>{//注释下列代码关闭CSRF保护options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());})
  1. 添加CSRF token
    添加用于写入token信息的脚本文件,设置文件属性为“嵌入的资源”并注入到项目中。在Startup启动类中注入脚本文件。
            app.UseSwaggerUI(options =>{//...options.InjectJavascript("ui/abp.js");//注入脚本文件});

脚本文件内容如下:

var getCookieValue = function(key) {var equalities = document.cookie.split('; ');for (var i = 0; i < equalities.length; i++) {if (!equalities[i]) {continue;}var splitted = equalities[i].split('=');if (splitted.length !== 2) {continue;}if (decodeURIComponent(splitted[0]) === key) {return decodeURIComponent(splitted[1] || '');}}return null;
};var csrfCookie = getCookieValue("XSRF-TOKEN");
var csrfCookieAuth = new SwaggerClient.ApiKeyAuthorization("X-XSRF-TOKEN", csrfCookie, "header");
swaggerUi.api.clientAuthorizations.add("X-XSRF-TOKEN", csrfCookieAuth);

5.2添加自定义首页

路径http://xxxx:xx/swagger/index.html对应的首页是系统默认的API管理界面,内嵌在Swashbuckle.AspNetCore程序包中,页面包含内容如下:

<!-- HTML for static distribution bundle build -->
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>%(DocumentTitle)</title><link rel="stylesheet" type="text/css" href="./swagger-ui.css" ><link rel="icon" type="image/png" href="./favicon-32x32.png" sizes="32x32" /><link rel="icon" type="image/png" href="./favicon-16x16.png" sizes="16x16" /><style>html{box-sizing: border-box;overflow: -moz-scrollbars-vertical;overflow-y: scroll;}*,*:before,*:after{box-sizing: inherit;}body{margin:0;background: #fafafa;}</style>%(HeadContent)</head><body><div id="swagger-ui"></div><!-- Workaround for https://github.com/swagger-api/swagger-editor/issues/1371 --><script>if (window.navigator.userAgent.indexOf("Edge") > -1) {console.log("Removing native Edge fetch in favor of swagger-ui's polyfill")window.fetch = undefined;}</script><script src="./swagger-ui-bundle.js"> </script><script src="./swagger-ui-standalone-preset.js"> </script><script>window.onload = function() {var configObject = JSON.parse('%(ConfigObject)');var oauthConfigObject = JSON.parse('%(OAuthConfigObject)');// If validatorUrl is not explicitly provided, disable the feature by setting to nullif (!configObject.hasOwnProperty("validatorUrl"))configObject.validatorUrl = null// If oauth2RedirectUrl isn't specified, use the built-in defaultif (!configObject.hasOwnProperty("oauth2RedirectUrl"))configObject.oauth2RedirectUrl = window.location.href.replace("index.html", "oauth2-redirect.html").split('#')[0];// Apply mandatory parametersconfigObject.dom_id = "#swagger-ui";configObject.presets = [SwaggerUIBundle.presets.apis, SwaggerUIStandalonePreset];configObject.layout = "StandaloneLayout";// Begin Swagger UI call regionconst ui = SwaggerUIBundle(configObject);ui.initOAuth(oauthConfigObject);// End Swagger UI call regionwindow.ui = ui}</script></body>
</html>

可以看到默认的首页已经提供了配置对象ConfigObject、验证授权配置对象OAuthConfigObject、验证地址ValidatorUrl、验证授权重定向地址OAuth2RedirectUrl。
如果觉得官方提供的首页在样式或功能上不满足要求,可以创建自定义的首页添加到wwwroot目录下,并设置文件属性为“嵌入的资源”。然后在Startup启动类的Configure方法中设置自定义的首页。

            app.UseSwaggerUI(options =>{//...options.IndexStream = () => Assembly.GetExecutingAssembly().GetManifestResourceStream("AbpDemo.Web.wwwroot.swagger.ui.index.html");//...});

更多详细功能可以参考swagger官方文档


源代码示例-Github

ABP学习实践(五)--引入Swagger对API接口进行管理相关推荐

  1. ABP学习实践(十六)--领域驱动设计(DDD)回顾

    ABP框架并没有实现领域驱动设计(DDD)的所有思想,但是并不妨碍用领域驱动的思想去理解ABP库框架. 1.领域驱动设计(DDD)与微服务(MicroService)的关系? 领域驱动设计(DDD)是 ...

  2. spring boot 集成springfox,使用swagger对 API 接口进行测试管理的 demo 示例

    1. 描述 一个springboot项目集成 springfox 3.0,使用swagger对 API 接口进行测试管理的 demo示例. 环境: IDE(idea):2021.3 JDK:1.8 m ...

  3. BT源代码学习心得(五):统一网络服务接口--RawServer -- 转贴自 wolfenstein (NeverSayNever)

    BT源代码学习心得(五):统一网络服务接口--RawServer author:wolfenstein 以后的部分都需要网络服务(种子文件的生成在本地就可以完成,但是通过这些种子文件下载实际的内容和提 ...

  4. 题库搜题内容内含五千万条数据api接口

    题库搜题内容内含五千万条数据api接口 本接口题库范围 大学生网课答案.公务员考试答案,外语类考试答案,财会类考试答案,建筑类考试答案,职业资格考试答案,学历考试考试答案,医药类考试答案,外贸类考试答 ...

  5. axios get 某个参数是数组怎么传_Vue 中 Axios 的封装和 API 接口的管理

    我们所要的说的axios的封装和api接口的统一管理,其实主要目的就是在帮助我们简化代码和利于后期的更新维护. 一.axios的封装 在vue项目中,和后台交互获取数据这块,我们通常使用的是axios ...

  6. $.post请求的参数在后台代码中得到为null_vue中Axios的封装和API接口的管理

    来源:愣锤 https://juejin.im/post/684490365288107214 如图,面对一团糟代码的你~~~真的想说,What F~U~C~K!!! 回归正题,我们所要的说的axio ...

  7. 【Vuejs】1028- 中 Axios 的封装和 API 接口的管理

    如图,面对一团糟代码的你~~~真的想说,What F~U~C~K!!! 回归正题,我们所要的说的axios的封装和api接口的统一管理,其实主要目的就是在帮助我们简化代码和利于后期的更新维护. 一.a ...

  8. vue中Axios的封装与API接口的管理详解

    一:axios的封装 vue项目中,和后台交互获取数据这块,我们通常使用的是axios库,它是promise的http库,可运行在浏览器端和node.js中. 安装 npm install axios ...

  9. 拦截器读post参数导致接口post请求报错_vue中Axios的封装和API接口的管理

    一.axios的封装 在vue项目中,和后台交互获取数据这块,我们通常使用的是axios库,它是基于promise的http库,可运行在浏览器端和node.js中.他有很多优秀的特性,例如拦截请求和响 ...

最新文章

  1. Spring Cloud Alibaba 高级特性 分布式事务:Alibaba Seata 如何实现分布式事务
  2. matlab api接口调用json格式
  3. 09-CA/TA编程:storage demo
  4. spring boot(二):web综合开发
  5. CodeForces - 1539F Strange Array(线段树区间合并)
  6. android 过滤数组中的重复元素,Flutter List数组避免插入重复数据的实现
  7. latex 多行公式_Markdown中输入多行并列的公式
  8. alert获取输入框内容_获取由 AlertDialog 生成的对话框中EditText的文本内容
  9. WPF中的附加行为简介
  10. factorybean 代理类不能按照类型注入_Spring拓展接口之FactoryBean,我们来看看其源码实现...
  11. c++:template使用中的常见报错
  12. 计算机关于职业与道德的论文怎么写,计算机职业道德论文提纲模板 计算机职业道德论文大纲怎么写...
  13. 聚类 Cluster
  14. 程序员对于35岁的担忧:未来真的没有什么好的前景吗?
  15. 还有什么苦,是这届年轻人在理财中吃过的?
  16. 英文PDF翻译你会吗?这个PDF翻译软件轻松搞定
  17. python刷问卷星
  18. 常用的php函数与类
  19. 备战数学建模1——MATLAB矩阵,二维图、三维图!(超级全面易懂)
  20. 太全了,一线互联网大厂都在用的Android UI框架完全解析,拿去吧你

热门文章

  1. 当代刑事诉讼模式的转型图景
  2. vue(17) : leaflet(2) : 距离测量
  3. 《人工智能各领域技能树汇总整理》
  4. ceph osd down修复
  5. 一、 计算机的体系结构
  6. 正点原子i2c读写24c512
  7. 怎么把服务器里面的微信拉到群里,把14亿中国人都拉进一个微信群里会有怎样的盛况?...
  8. MySQL——单表查询
  9. codevs1384黑色星期五【USACO】
  10. photoshop里上色之后,颜色总是灰色的,解决办法