.NET Core使用Swagger 搭建 RESTful 风格 API 服务

240 阅读2分钟

什么是Swagger

  • 本文已参与「新人创作礼」活动,一起开启掘金创作之路。

Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。通俗来说就是一个Api文档工具。NuGet包为 Swashbuckle.AspNetCore

Swagger他能做什么?

经历过传统开发的朋友应该深有感触,我记得我刚实习那一会儿,使用的是有道云,然后用Table的方式将Url,请求参数,返回参数一个一个填写到表格里面,每个字段的意思也要标注明白,再发给前端让前端再去对Api,如果出现改动还得去更新文档。
可想而知是非常耗费时间的,而且前端同事阅读起来也非常的不方便,使用Swagger能够将你代码注解直接展现,而且及时发布及时生效,对前后端分离项目非常友好。

Swagger有什么优点?

  • 支持多语言
  • 支持在线对接口进行调用测试
  • 遵循OpenAPI 规范
  • 接口文档在线生成
  • 开源

如何在.NET Core项目中使用基础的Swagger

在Visual Studio中创建WebApi项目会默认在Proram中注入和引入Swagger中间件服务。但是提供的功能相对来说比较简单。我们可以自己动手来玩转Swagger。

image.png 上图是创建WebApi项目的时候默认生成的Swagger注入的服务,以及添加的中间件!

builder.Services.AddSwaggerGen(options =>
{
    options.SwaggerDoc("v1", new OpenApiInfo
    {
        Version = "v1",
        Title = "API标题",
        Description = "API描述"
    });
});

image.png

如上AddSwaggerGen使用了一个SwaggerGenOptions委托他提供了非常多的方法,如SwaggerDoc是为接口文档添加一些描述标注,但是这个时候你会发现我的Api没有描述如何让前端知道字段是什么意思?委托还提供了另外一个方法IncludeXmlComments 他主要是将项目生成的XML文件为接口提供了方法、参数、返回添加一些描述。

var xmlFilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFilename));
/// <summary>
/// 获取用户详情
/// </summary>
/// <param name="userId">用户编号</param>
/// <returns></returns>
[HttpGet("{userId}")]
public UserInfo GetUser(int userId)
{
    return new UserInfo();
}

/// <summary>
/// 用户信息
/// </summary>
public class UserInfo 
{
    /// <summary>
    /// 用户编号
    /// </summary>
    public int UserId { get; set; }
    /// <summary>
    /// 用户名称
    /// </summary>
    public string UserName { get; set; }
}

image.png 加上之后可以看到我们Api一些基础信息都展示出来了,确实非常的简单明了

使用Swagger为服务分组

比如在我们的商城管理系统中来说,我们用户是一个服务,订单也是一个服务,所有的API全放在一起,会让人非常疑惑。在我们 app.UseSwaggerUI 提供了一个委托。

builder.Services.AddSwaggerGen(options =>
{
    options.SwaggerDoc("v1", new OpenApiInfo
    {
        Version = "v1",
        Title = "用户服务",
        Description = "API描述"
    });
    options.SwaggerDoc("v2", new OpenApiInfo
    {
        Version = "v2",
        Title = "订单服务",
        Description = "API描述" 
    });
    var xmlFilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
    options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFilename));
});

app.UseSwaggerUI(c =>
{
    c.SwaggerEndpoint("/swagger/v1/swagger.json", "用户服务");
    c.SwaggerEndpoint("/swaggerv2/swagger.json", "订单服务");
});

给大家附图看效果,这里要注意的是分组展示需要在方法上面添加 ApiExplorerSettings 特性

/// <summary>
/// 获取订单详情
/// </summary>
/// <param name="orderId">订单编号</param>
/// <returns></returns>
[HttpGet("{orderId}")]
[ApiExplorerSettings(GroupName = "v2")]
public OrderInfo Get(int orderId) 
{
    return new OrderInfo();
}

image.png

更改 Swagger 的相对路径

默认情况下,Swagger UI 将显示在“/swagger”。如有必要,可以在 app.UseSwaggerUI中间件加入如下配置。

app.UseSwaggerUI(c =>
{
    c.RoutePrefix = "api"
}

总结

这里只为大家讲述了一些比较简单的用法,感兴趣的朋友也可以去查阅他的源码,还有很多功能没有讲述到,本文不做太多赘述,如:为Swagger添加自定CSS,为Swagger上锁(也就是授权访问Api)等等,可以根据项目需求,去查阅配置,非常简单。