使用Web API时,了解其各类方法对开发人员来讲多是一项挑战。
Swagger也称为OpenAPI,解决了为 Web API 生成有用文档和帮助页的问题。 它具备诸如交互式文档、客户端 SDK生成和API可发现性等优势。css
是一个开源项目,用于生成 ASP.NET Core Web API 的 Swagger 文档。html
是另外一个用于生成 Swagger 文档并将 Swagger UI 或 ReDoc 集成到 ASP.NET Core Web API 中的开源项目。 此外,NSwag 还提供了为 API 生成 C# 和 TypeScript 客户端代码的方法。json
Swagger是一个与语言无关的规范,用于描述REST API。 Swagger项目已捐赠给OpenAPI计划,如今它被称为开放API。这两个名称可互换使用,但OpenAPI是首选。它容许计算机和人员了解服务的功能,而无需直接访问实现(源代码、网络访问、文档)。其中一个目标是尽可能减小链接取消关联的服务所需的工做量。 另外一个目标是减小准确记录服务所需的时间。api
Swagger 流的核心是Swagger规范,默认状况下是名为
swagger.json
的文档。 它由 Swagger工具链(或其第三方实现)根据你的服务生成。它描述了 API 的功能以及使用 HTTP 对其进行访问的方式。 它驱动Swagger UI,并由工具链用来启用发现和客户端代码生成。网络
Swagger UI提供了基于Web的UI,它使用生成的Swagger规范提供有关服务的信息。 Swashbuckle和NSwag均包含Swagger UI的嵌入式版本,所以可以使用中间件注册调用将该嵌入式版本托管在ASP.NET Core 应用中。架构
Swashbuckle 有三个主要组成部分:app
将 SwaggerDocument 对象公开为 JSON 终结点的 Swagger 对象模型和中间件。工具
从路由、控制器和模型直接生成 SwaggerDocument 对象的 Swagger 生成器。 它一般与 Swagger 终结点中间件结合,以自动公开 Swagger JSON。visual-studio
Swagger UI 工具的嵌入式版本。 它解释 Swagger JSON 以构建描述 Web API 功能的可自定义的丰富体验。 它包括针对公共方法的内置测试工具。测试
Nuget 安装:Swashbuckle.AspNetCore
建议大于等于5.0版本
Startup.ConfigureServices
方法中的服务集合中NetCore 3.1中,原NetCore2.2中的
Info
已经升级为OpenApiInfo
。
// Register the Swagger generator, defining 1 or more Swagger documents services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" }); });
主项目生成的地方记得勾选,生成XML,这个用于加强
// 注册Swagger生成器,定义一个和多个Swagger文档 services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Version = "v1", Title = "ToDo API", Description = "A simple example ASP.NET Core Web API", TermsOfService = new Uri("https://example.com/terms"), Contact = new OpenApiContact { Name = "Shayne Boyer", Email = string.Empty, Url = new Uri("https://twitter.com/spboyer"), }, License = new OpenApiLicense { Name = "Use under LICX", Url = new Uri("https://example.com/license"), } }); // Set the comments path for the Swagger JSON and UI. var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); c.IncludeXmlComments(xmlPath); });
反射用于生成与 Web API 项目相匹配的 XML 文件名。 AppContext.BaseDirectory属性用于构造 XML 文件的路径。 一些 Swagger 功能(例如,输入参数的架构,或各自属性中的 HTTP 方法和响应代码)无需使用 XML 文档文件便可起做用。 对于大多数功能(即方法摘要以及参数说明和响应代码说明),必须使用 XML 文件。
Startup.Configure
方法中,启用中间件为生成的JSON文档和Swagger UI提供服务// 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"); });
// 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"); // 要在应用的根 (http://localhost:<port>/) 处提供 Swagger UI,请将 RoutePrefix 属性设置为空字符串: //c.RoutePrefix = string.Empty; // 要在应用的根 (http://localhost:<port>/) 处提供 Swagger UI,请将 RoutePrefix 属性设置为空字符串: c.RoutePrefix = "doc"; });
/// <summary> /// 获取列表信息 /// </summary> /// <returns></returns> [HttpGet] public IEnumerable<string> Get() { return new string[] { "value1", "value2" }; }
Swagger UI 显示上述代码的
<summary>
元素的内部文本
/// <summary> /// 获取列表信息 /// </summary> /// <remarks> /// 示例请求: /// /// GET /Get /// { /// "id": 1, /// "name": "Item1", /// "isComplete": true /// } /// /// </remarks> /// <returns></returns> [HttpGet] public IEnumerable<string> Get() { return new string[] { "value1", "value2" }; }
将
元素添加到Get操做方法文档。 它能够补充 元素中指定的信息,并提供更可靠的 Swagger UI。 元素内容可包含文本、JSON 或 XML。
using System.ComponentModel; using System.ComponentModel.DataAnnotations; namespace TodoApi.Models { public class TodoItem { public long Id { get; set; } [Required] public string Name { get; set; } [DefaultValue(false)] public bool IsComplete { get; set; } } }
使用
System.ComponentModel.DataAnnotations
命名空间中的属性来标记模型,以帮助驱动Swagger UI组件。将[Required]
属性添加到TodoItem
类的Name
属性。
[Produces("application/json")] [Route("api/[controller]")] [ApiController] public class TodoController : ControllerBase { private readonly TodoContext _context;
将
[Produces("application/json")]
属性添加到API控制器。 这样作的目的是声明控制器的操做支持application/json
的响应内容类型。
/// <summary> /// Creates a TodoItem. /// </summary> /// <remarks> /// Sample request: /// /// POST /Todo /// { /// "id": 1, /// "name": "Item1", /// "isComplete": true /// } /// /// </remarks> /// <param name="item"></param> /// <returns>A newly created TodoItem</returns> /// <response code="201">Returns the newly created item</response> /// <response code="400">If the item is null</response> [HttpPost] [ProducesResponseType(StatusCodes.Status201Created)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public ActionResult<TodoItem> Create(TodoItem item) { _context.TodoItems.Add(item); _context.SaveChanges(); return CreatedAtRoute("GetTodo", new { id = item.Id }, item); }
使用Web API的开发人员最关心的问题是返回的内容,特别是响应类型和错误代码(若是不标准)。 在 XML注释和数据注释中表示响应类型和错误代码。
Create 操做成功后返回 HTTP 201 状态代码。 发布的请求正文为 NULL 时,将返回 HTTP 400 状态代码。 若是 Swagger UI 中没有提供合适的文档,那么使用者会缺乏对这些预期结果的了解。
public void Configure(IApplicationBuilder app) { app.UseStaticFiles();
API 文档页应表明品牌或主题。 将 Swashbuckle 组件标记为须要添加资源以提供静态文件,并构建文件夹结构以托管这些文件。
从 Swagger UI GitHub 存储库中获取 dist 文件夹的内容。 此文件夹包含 Swagger UI 页必需的资产。
建立 wwwroot/swagger/ui 文件夹,而后将 dist 文件夹的内容复制到其中 。
使用如下 CSS 在 wwwroot/swagger/ui 中建立 custom.css 文件,以自定义页面标题
.swagger-ui .topbar { background-color: #000; border-bottom: 3px solid #547f00; }
引用其余 CSS 文件后,引用“ui”文件夹内 index.html 文件中的 custom.css :
<link href="https://fonts.googleapis.com/css?family=Open+Sans:400,700|Source+Code+Pro:300,600|Titillium+Web:400,600,700" rel="stylesheet"> <link rel="stylesheet" type="text/css" href="./swagger-ui.css"> <link rel="stylesheet" type="text/css" href="custom.css">