动态 WebApi 引擎使用教程(3行代码完成动态 WebApi 构建)
时间:2022-09-07 11:14
目录
什么是 WebApiEngine?
WebApiEngine 是一个可用于动态 WebApi 生成的引擎,基于 .NET Core(包括 .NET 5、 .NET 6),用于解决前后端分离、微服务、异步 Web 请求场景下的 WebApi 的动态生成和管理,并全面兼容 Swagger。
开源地址
WebApiEngine 完全开源,可商用。承载于 Senparc.CO2NET.WebApi 库,同属于 CO2NET 开源项目:
使用方法
以下是 WebApiEngine 的使用方法,将以最原始的默认 .NET Core WebApi 模板项目作为基础进行构建,以便大家学习和亲手实践。
首先,使用 Visual Stduio 或命令行创建原始项目。
选择 ASP.NET Core Web API 项目
或使用命令行,免去创建项目的其他步骤:
dotnet new webapi
命令行创建项目模板
项目创建完成后,已经默认包含了一个模拟气象数据查询的接口:
原始项目
小贴士:您可以使用 NET Core 3.1 或 .NET 5、.NET 6 进行开发,代码没有任何差别。
运行后默认已经加载了 Swagger:
原始运行页面,为 Swagger 首页
使用 Swagger 我们已经可以测试 API:
使用 Swagger 测试接口运行
此处的 API 还是需要手写 API 才能完成,打开 WeatherForecastController.cs 可以看到初始化内容:
越来越复杂、混乱的 API 导致了大量低效、低价值的重复劳动
为了解决这样的问题,WebApiEngine 登场了! 让我们来看看 WebApiEngine 能做什么?
使用 [ApiBind] 标签让任何方法变成 WebApi
我们在 WeatherService 下再创建一个名为 GetWeatherForecast 的新方法,并附加一个 int 类型参数,用于演示新的接口:
1 public WeatherForecast GetWeatherForecast(int index) 2 { 3 var rng = new Random(); 4 return new WeatherForecast 5 { 6 Date = DateTime.Now.AddDays(index), 7 TemperatureC = rng.Next(-20, 55), 8 Summary = Summaries[rng.Next(Summaries.Length)] 9 }; 10 }
然后,通过加单的 3 步,完成动态 API 的实现:
第一步:安装 Senparc.CO2NET.WebApi 包:
安装 Senparc.CO2NET.WebApi 包
也可以在项目目录下,使用命令行添加:
dotnet add package Senarc.CO2NET.WebApi
第二步:在 ConfigureServices() 方法中添加两行代码:
1 var builder = services.AddMvcCore().AddApiExplorer(); 2 services.AddAndInitDynamicApi(builder, null);
第三步:添加 [ApiBind] 标签
在任意方法上添加 [ApiBind] 标签,如之前创建的 GetWeatherForecast(int index) 方法:
1 [ApiBind] 2 public WeatherForecast GetWeatherForecast(int index) 3 { 4 var rng = new Random(); 5 return new WeatherForecast 6 { 7 Date = DateTime.Now.AddDays(index), 8 TemperatureC = rng.Next(-20, 55), 9 Summary = Summaries[rng.Next(Summaries.Length)] 10 }; 11 }
完成!
重新启动项目,即可看到新的 GetWeatherForecast 接口:
|
||||
运行结果: WebApiEngine 会自动处理重名的 API
复制特性动态 API 的另外一个难点是,正常的 WebAPI 通常都需要定义自己的特性,如访问鉴权、行为过滤,等等。WebApiEngine可以将原始方法上的特性标签直接复制到动态 API 上。 我们在 GetWeatherForecast 方法上添加权限验证特性: 1 [ApiBind("WeatherForecast", "MyApi")] 2 [Authorize] 3 public WeatherForecast GetWeatherForecast(int index) 4 { 5 var rng = new Random(); 6 return new WeatherForecast 7 { 8 Date = DateTime.Now.AddDays(index), 9 TemperatureC = rng.Next(-20, 55), 10 Summary = Summaries[rng.Next(Summaries.Length)] 11 }; 12 } 然后运行接口: [Authorize] 标签生效
上面的测试可以看到 [Authorize] 标签已经生效(虽然提示了 Authorize 配置错误,是因为我们没有进行授权配置)。 WebApiEngine 支持所有的特性标签。
为整个类配置 WebApi除了在某个具体的方法上添加 [ApiBind] 特性标签,您还可以在类(class)上使用此特性,使下属所有的方法(包括静态方法)都拥有相同的配置。 class 上的特性标签同样会自动配置,其规则如下:
测试: 将之前的 WeatherService2 类进行重写: 1 [ApiBind("ClassCoverAttribute", "MyApi")] 2 public class WeatherService2 3 { 4 public string GetWeatherForecast(string str) 5 { 6 return "the parameter value is :" + str; 7 } 8 9 [ApiBind(ApiRequestMethod = ApiRequestMethod.Get)] 10 public string GetWeatherForecastCopy(string str) 11 { 12 return "the parameter value is :" + str; 13 } 14 15 public static string GetWeatherForecastCopyStatic(string str) 16 { 17 return "[static method]the parameter value is :" + str; 18 } 19 } 第 1 行代码在 class 上进行添加,使其中 2 个方法都生效。 第 9 行代码改写了 ApiBind 标签,使默认的 Post 方法,改为了 Get 方法。 第 10 行代码是一个静态方法,同样能“享受”整个 class 的配置(当然也支持使用自定义 [ApiBind],然后覆盖 class 的配置)。
运行结果:
运行结果中:
忽略某些特定的方法有时,虽然我们偷懒将某个 class 一次性标记为 [ApiBind],但也会有个别的方法,我们并不希望开放为 API,这时候,可以使用 WebApiEngine 提供的忽略方法。 有两种方式可以做到。 方式一:使用 IgnoreApiBind 特性,如: 1 [IgnoreApiBind] 2 public static string GetWeatherForecastCopyStatic(string str) 3 { 4 return "[static method]the parameter value is :" + str; 5 } 方式二:设置 ApiBind 特性中的 Ignore 属性,如: 1 [ApiBind(Ignore = true)] 2 public static string GetWeatherForecastCopyStatic(string str) 3 { 4 return "[static method]the parameter value is :" + str; 5 }
忽略某些特定的分类通过配置,我们也可以忽略部分特定的分类(Category),在运行引擎之前,在 startup.cs 中进行定义: 1 Senparc.CO2NET.WebApi.Register.AddOmitCategory("WeatherForecast"); 2 3 var builder = services.AddMvcCore().AddApiExplorer(); 4 services.AddAndInitDynamicApi(builder, null); 只需添加上述第 1 行代码,即可忽略整个 WeatherForecast 分类的接口(当然不能忽略通过原始方法编写的 Controller 内的 API):
进阶请关注后续内容:
本文示例源码下载
[本系列未完待续,持续更新中]
相关推荐
电脑软件本类排行
今日推荐热门手游 |