Asp.netCore3.0 WebApi从0到1手摸手教你写【
今天的任务是给我们写的接口增加一个swagger接口文档
第一步添加swagger包
打开程序包管理控制台,然后输入以下代码安装swagger包
Install-Package Swashbuckle.AspNetCore -Version 5.0.0-rc4
经过测试,如果通过Nuget包管理器安装swagger只能安装4.0.1版本,但是这个版本尝试以后不支持.NetCore3.0,所以要按照上面的方法用命令行的方式安装Swashbuckle.AspNetCore5.0版本
安装完毕以后可以在包中看到Swashbuckle.AspNetCore5.0
第二步设置API输出XML文档文件
双击Properties,在打开的页面选择生成,按照红框内容配置xml文件输出
Properties
输出xml文档文件
第三步注册Swagger服务
打开XXX.api中Startup.cs
文件,在ConfigureServices
中注册Swagger服务
// 用来向容器中注册服务,注册好的服务可以在其他地方进行调用
public void ConfigureServices(IServiceCollection services)
{
//数据库连接字符串
string conn = Configuration.GetConnectionString("xxxDB");
Models.XXXEntities.xxxContext.ConStr = conn;
//注册swagger服务,定义1个或者多个swagger文档
services.AddSwaggerGen(s=> {
//设置swagger文档相关信息
s.SwaggerDoc("v1", new OpenApiInfo
{
Title = "xxxWebApi文档",
Description = "这是一个简单的NetCore WebApi项目",
Version = "v1.0"
});
//获取xml注释文件的目录
var xmlFile = $"{System.Reflection.Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = System.IO.Path.Combine(AppContext.BaseDirectory, xmlFile);
// 启用xml注释
s.IncludeXmlComments(xmlPath);
});
services.AddControllers();
services.AddRouting();
//services.AddDbContext<Models.XXXEntities.xxxContext>(options =>
//{
// options.UseSqlServer(conn);
//});
}
SwaggerDoc
是配置Swagger文档相关属性的地方,比如名称、描述、版本等
IncludeXmlComments
设置第二步中xml文档文件路径
打开XXX.api中Startup.cs
文件,在Configure
中启用Swagger服务
// 用来配置中间件管道,即如何响应http请求.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("api/Error");
}
app.UseRouting();
app.UseAuthorization();
//启用swagger中间件
app.UseSwagger(opt=> {
//opt.RouteTemplate = "api/{controller=Home}/{action=Index}/{id?}";
});
//启用SwaggerUI中间件(htlm css js等),定义swagger json 入口
app.UseSwaggerUI(s => {
s.SwaggerEndpoint("/swagger/v1/swagger.json", "xxxWebapi文档v1");
//要在应用的根 (http://localhost:<port>/) 处提供 Swagger UI,请将 RoutePrefix 属性设置为空字符串:
//s.RoutePrefix = string.Empty;
});
app.UseEndpoints(endpoints =>
{
//endpoints.MapControllerRoute(
// name: "default",
// pattern: "api/{controller}/{action}/{id?}");
endpoints.MapControllers();
});
}
如果想通过http://xxxx.com:<port>
的方式访问Swagger文档则添加RoutePrefix = string.Empty;
即可
如果使用目录及 IIS 或反向代理,请使用 ./
前缀将 Swagger
终结点设置为相对路径。 例如 ./swagger/v1/swagger.json
。 使用/swagger/v1/swagger.json
指示应用在 URL 的真实根目录中查找 JSON 文件(如果使用,加上路由前缀)。 例如,请使用 http://localhost:<port>/<route_prefix>/swagger/v1/swagger.json
而不是http://localhost:<port>/<virtual_directory>/<route_prefix>/swagger/v1/swagger.json
。
第四步解决No operations defined in spec!问题
一般来说按照上面的方式配置好就可以访问Swagger文档了,但是最后还是出了“No operations defined in spec!”的问题
No operations defined in spec!
问题原因:在前2个教程中我们将路由配置统一从
Controller中注释掉的路由模版Controller
中去掉然后endpoints.MapControllerRoute
设置了路由模版,由于Swagger无法在Controller
中找到[Route("api/[controller]/[action]")]
和[ApiController]
从而触发了“No operations defined in spec!”的问题。下图是我们注释的内容和增加的内容
Startup.cs中增加的路由模版
解决方案
1.将Startup.cs
中Configure
里的路由模版注释掉,改成endpoints.MapControllers();
然后在Controller里添加路由模版,此方法虽然可以解决问题,但是并不是最优的。
2.【最优方案】将Startup.cs
中Configure
里的路由模版注释掉,改成endpoints.MapControllers();
,增加BaseController.cs
并继承ControllerBase
,然后在BaseController
设置路由模版,让Controller
继承BaseController
。说的有点饶舌,看代码
BaseController.cs代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
namespace XXX.api
{
/// <summary>
/// 自定义路由模版
/// 用于解决swagger文档No operations defined in spec!问题
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
public class BaseController : ControllerBase
{
}
}
UserController.cs代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace XXX.api.Controllers
{
/// <summary>
/// 用户接口
/// </summary>
//[Route("api/[controller]/[action]")]
//[ApiController]
public class UserController : BaseController
{
/// <summary>
/// 测试接口
/// </summary>
/// <returns></returns>
[HttpGet]
public IActionResult Login()
{
return Ok("hello");
}
/// <summary>
/// 增加一个用户
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
[HttpPost]
public IActionResult AddUser([FromBody]Models.User.AddUserP model)
{
var r = Bo.UserBo.AddUser(model);
return Ok(r);
}
}
}
第五步解决CS1591警告
配置完Swagger以后出现了一个令人不爽的警告
令人不爽的警告令人不爽的警告
干掉它们
-
双击Properties
Properties -
找到生成,定位到错误和警告
生成
3.新增取消显示警告1591
1591
4.令人不爽的警告消失了
警告消失
第六步测试Swagger文档
运行成功的界面
Swagger
尝试一个post请求
请求参数返回值
总结:通过这3个教程基本上就可以初步掌握如何用NetCore3.0写WebApi了,后面可能会写几个Webapi优化的教程。这个教程适合小白学习入门使用,如果有不对的地方欢迎大家指出。
最后问下各位做.Net的同学们,在实际项目中大家用NetCore写Webapi的时候多吗?欢迎大家在留言区讨论。