Swagger 与 OpenAPI 的历史来源:

Swagger 项目于 2015 年捐赠给 OpenAPI Initiative,此后被称为 OpenAPI。这两个名称可以互换使用。但是,“OpenAPI”指的是规范。“Swagger”是指来自 SmartBear 的符合 OpenAPI 规范的开源和商业产品系列。

简而言之:

  • OpenAPI 是一种规范。
  • Swagger 是使用 OpenAPI 规范的工具。例如,OpenAPIGenerator 和 SwaggerUI。

1. OpenAPI

OpenAPI 规范用于描述api的基本信息及功能。比如,API支持的http 方法,响应结果skema, 响应状态码等等。OpenAPI的声明定义方式可以通过json 和 yaml的方式,以下是通过yaml 描述api的一个基本例子。

openapi: 3.0.0
info:
title: Sample API
description: Optional multiline or single-line description in [CommonMark](http://commonmark.org/help/) or HTML.
version: 0.1.9
servers:
- url: http://api.example.com/v1
description: Optional server description, e.g. Main (production) server
- url: http://staging-api.example.com
description: Optional server description, e.g. Internal staging server for testing
paths:
/users:
get:
summary: Returns a list of users.
description: Optional extended description in CommonMark or HTML.
responses:
'200': # status code
description: A JSON array of user names
content:
application/json:
schema:
type: array
items:
type: string

2. 单个项目中集成 Swashbuckle

Swashbuckle 包含三个主要组件:

  • Swashbuckle.AspNetCore.Swagger:Swagger 对象模型和中间件,用于将SwaggerDocument对象公开为 JSON 端点。

  • Swashbuckle.AspNetCore.SwaggerGen:一个 Swagger 生成器,可SwaggerDocument直接从您的路由、控制器和模型构建对象。它通常与 Swagger 端点中间件结合使用以自动公开 Swagger JSON。

  • Swashbuckle.AspNetCore.SwaggerUI:Swagger UI 工具的嵌入式版本。它解释 Swagger JSON 以构建丰富的、可定制的体验来描述 Web API 功能。它包括用于公共方法的内置测试工具。

Basic 用法:

将 Swagger 生成器添加到方法中的服务集合中Startup.ConfigureServices

public void ConfigureServices(IServiceCollection services)
{ // Register the Swagger generator, defining 1 or more Swagger documents
services.AddSwaggerGen();
}

在该Startup.Configure方法中,启用中间件以提供生成的 JSON 文档和 Swagger UI:

public void Configure(IApplicationBuilder app)
{
// Enable middleware to serve generated Swagger as a JSON endpoint.
app.UseSwagger(); // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.),
// specifying the Swagger JSON endpoint.
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
}); ......
}

详细的Swagger 文档

在AddSwaggerGen 时,我们可以向其中传入参数 Action<SwaggerGenOptions> 这个参数,来声明我们如何创建OpenAPI 文档来描述我们的api。

 services.AddSwaggerGen(c =>
{
          //声明文档的名字, title, version 等基本信息
c.SwaggerDoc("v1", new OpenApiInfo { Title = "My Example APIs", Version = "v1" });
c.CustomSchemaIds((type) => type.FullName);
          // 通过path 判断哪些api 应该被显示在文档上
c.DocInclusionPredicate((docName, apiDescription) => apiDescription.RelativePath.Contains("api/v1"));

   // 包含描述性的 xml 文档
          var xmlDoc = Path.Combine(AppContext.BaseDirectory, $"{this.GetType().Assembly.GetName().Name}.XML");
if (File.Exists(xmlDoc))
c.IncludeXmlComments(xmlDoc);
});

3. 微服务多应用的Swagger用法

我们在之前的例子中,一直是对单个应用的单个文档,那么对于多个应用的文档,我们如何集中显示,方便开发人员查找与使用。

既然UseSwagger这个中间件可以帮助我们host生成的swagger json 文件,那么是不是我们通过一个application(api-explorer)来显示各个appplication的文档就可以,这能做到么?

答案是: 利用swagger的UI 前端文件。

这里给一个最basic的实现,使用的时候,可以各种定制化样式,加入请求验证等等;

    <script src="./swagger-ui-bundle.js"> </script>
<script>
const apis = config.urls.sort((a, b) => a.name.localeCompare(b.name));
jwtToken = `Bearer ${token}`;
const ui = SwaggerUIBundle({
// 重中之重
urls: [{url, name}],
dom_id: '#swagger-ui',
deepLinking: true,
// Add jwt token to header start
requestInterceptor: function(request) {
request.headers.Authorization = jwtToken;
return request;
},
// Add jwt token to header finish layout: "StandaloneLayout"
})
window.ui = ui;
})
}
</script>

我们可以通过配置文件的形式,注册好各个application的url,和它们各自的名字。

[{url: '/a/a', name: 'aa'}, {url: '/b/b', name: 'bb'}] 这种形式。

SwaggerUI 和 SwaggerUI bundle 可以接受的参数如链接,大家可以找到自己需要的参数去配置需要的功能。

swagger-ui/docs/usage/configuration.md

https://github.com/swagger-api/swagger-ui/blob/master/docs/usage/configuration.md

-----------------------------------------------------------------------------------------------------------------------------------------------------

欢迎大家讨论交流,指出不足,谢谢!

.NET Core 中的 Swagger 应用与微服务场景下的Swagger Api 集成显示的更多相关文章

  1. CI Weekly #11 | 微服务场景下的自动化测试与持续部署

    又一周过去了,最近我们的工程师正在搞一个"大事情" --「[flow.ci](http://flow.ci/?utm_source=bokeyuan&utm_medium= ...

  2. TOP100summit:【分享实录-华为】微服务场景下的性能提升最佳实践

    本篇文章内容来自2016年TOP100summit华为架构部资深架构师王启军的案例分享.编辑:Cynthia 王启军:华为架构部资深架构师.负责华为的云化.微服务架构推进落地,前后参与了华为手机祥云4 ...

  3. 【星云测试】Devops微服务架构下具有代码级穿透能力的精准测试

    微服务是Devops场景下热门的开发框架,在大型项目中被广泛采用.它把一个大型的单个应用程序和服务拆分为数十个的支持微服务,独立部署.互相隔离,通过扩展组件来处理功能瓶颈问题,比传统的应用程序更能有效 ...

  4. 微服务架构下 CI/CD 如何落地

    本文系云原生应用最佳实践杭州站活动演讲稿整理.杭州站活动邀请了 Apache APISIX 项目 VP 温铭.又拍云平台开发部高级工程师莫红波.蚂蚁金服技术专家王发康.有赞中间件开发工程师张超,分享云 ...

  5. .NET Core微服务之基于Ocelot实现API网关服务

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.啥是API网关? API 网关一般放到微服务的最前端,并且要让API 网关变成由应用所发起的每个请求的入口.这样就可以明显的简化客户端 ...

  6. 微服务框架下的思维变化-OSS.Core基础思路

    如今框架两字已经烂大街了,xx公司架构设计随处可见,不过大多看个热闹,这些框架如何来的,细节又是如何思考的,相互之间的隔离依据又是什么...相信很多朋友应该依然存在自己的疑惑,特别是越来越火热的微服务 ...

  7. 微服务:springboot与swagger2的集成

    现在测试都提倡自动化测试,那我们作为后台的开发人员,也得进步下啊,以前用postman来测试后台接口,那个麻烦啊,一个字母输错就导致测试失败,现在swagger的出现可谓是拯救了这些开发人员,便捷之处 ...

  8. CI Weekly #5 | 微服务架构下的持续部署与交付

    CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成.持续交付,持续部署.自动化测试. DevOps 等实践教程.工具与资源,以及一些工程师文化相关的程序员 Ti ...

  9. 微服务架构下分布式Session管理

    转载本文需注明出处:EAII企业架构创新研究院(微信号:eaworld),违者必究.如需加入微信群参与微课堂.架构设计与讨论直播请直接回复此公众号:“加群 姓名 公司 职位 微信号”. 一.应用架构变 ...

随机推荐

  1. VTA硬件

    VTA硬件 提供了VTA硬件设计的自上而下的概述.本硬件设计涵盖两个级别的VTA硬件: VTA设计及其ISA硬件-软件接口的体系结构概述. VTA硬件模块的微体系结构概述以及计算核心的微代码规范. V ...

  2. spring 声明式事务剖析

    spring事务是在数据库事务的基础上进行封装扩展, 支持原有事务的隔离级别, 加入了事务传播的概念,提供多个事务合并和分割的功能, 提供声明式事务,让事务和业务代码分开 spring提供了三个接口供 ...

  3. 【NX二次开发】Block UI 分割线

    设置控件可见 this->separator0->GetProperties()->SetLogical("Show",true);

  4. NX二次开发-将3X3矩阵修正为正交且长度为单位长度的矩阵

    函数:UF_MTX3_ortho_normalize() 函数说明:将矩阵修正为正交且xyz长度为单位长度的矩阵.下图中输入的矩阵为三条线段的端点,经过修正后,生成一个坐标系. 1 #include ...

  5. python通过字典实现购物车案例-用户端

    import os dict01 = { 'iphone' : { '5999' : { '总部位于美国' : '价格相对较贵', }, }, 'wahaha' : { '15' : { '总部位于中 ...

  6. 图文并茂教你学会使用 IntelliJ IDEA 进行远程调试

    1. 前言 今天线上出现了个 Bug ,而且比较坑的是涉及到微信相关的东西不能线下调试.传统方式是在代码中各种的日志 log 埋点然后重新部署进行调试,再根据 log 中的信息进行分析.如果你的 lo ...

  7. 『动善时』JMeter基础 — 51、使用JMeter测试WebService接口

    目录 1.什么是WebService 2.WebService和SOAP的关系 3.什么是WSDL 4.测试WebService接口前的准备 (1)如何判断是WebService接口 (2)如何获取W ...

  8. Redis 雪崩、穿透、击穿、并发、缓存讲解以及解决方案

    1.缓存雪崩 数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机. 比如一个雪崩的简单过程 1.redis集群大面积故障 2.缓存 ...

  9. 关于Android Studio Emulator常见使用问题

    Q:模拟器无法初始化声音相关设备 Emulator: dsound: Could not initialize DirectSoundCapture Emulator: dsound: Reason: ...

  10. 在Linux/Unix系统下用iconv命令处理文本文件中文乱码问题

    iconv命令是运行于linux/unix平台的文件编码装换工具.当我们在linux/unix系统shell查看文本文件时,常常会发现文件的中文是乱码的,这是由于文本文件的编码与当前操作系统设置的编码 ...