NetCore中WebApi自动根据Action谓词自动添加请求方式,无需再写手动添加HttpMethod特性,RouteAttribute特性,ActionName特性隐藏实际Action名称。这里你只需要简单的引用即可。完全兼容原始WebApi,且路由生成方式跟原始路由Api一样。
NetCore中指明一个类是控制器有以下三种方式:
1.以Controller结尾的类
2.继承了ControllerBase的类
3.使用ApiController特性并结合RouteAttribute特性的类
以上这三种情况,只要不标注NonController特性都是Controller
这里主要通过实现IApplicationModelConvention接口,应用模型转换器,实现根据Action方法符合驼峰模式取第一个单词来判断并加入请求方式。
这里你只需要添加简单的一句话即可:
services.AddMvcCore(option =>
{
//动态api模型转换可以设置一些静态值
//DefaultHttpMethod 默认的Http请求方式当不能通过谓词推断出来时,默认值为post
//DefaultControllerRouteAttributeTemplate 默认在Controller上添加的RouteAttribute的Template 默认值为:"api/[controller]/[action]"
//HttpVerbs 请求谓词是一个kv 默认提供了一些请求谓词对应的请求方式 你可以自动添加
//ApplicationModel 暴露出来用于Action生成功能点
//动态Api转换
option.Conventions.Add(new DynamicApiControllerApplicationModelConvention());
})
添加这句话之后你可以直接写一个Controller类就可以完成动态Api的生成
public class DyApiController
{
private readonly IOptions<MvcOptions> _options;
public async Task DeleteDynamicApi(int i)
{
await Task.CompletedTask;
}
[NonAction]
public async Task PutDynamicApi(int i)
{
await Task.CompletedTask;
}
[ActionName("testDy3")]
public void TestDynamicApi3()
{
}
[Route("/hiroute")]//存在/开头前缀无效
public void TestDynamicApi()
{
}
//[Route("")]
[HttpGet]
public void TestDynamicApi2()
{
}
[ActionName("testDy4")]//如果存在ActionName ActionName将替换TestDynamicApi4的名称
//[Route("hi")]
[HttpPost("/a")]
[HttpGet("a/b/{i}")]
[AllowAnonymous]
public void TestDynamicApi4(int i)
{
}
[Route("")]//route为空 默认使用 apiPrefix/controllerName/actionName/{Route或HttpMethod特性中非/开头的template}
public void DeleteDynamicApi5(int i)
{
}
[ActionName("da6")]
public async Task InsertDynamicApi6Async(int i)
{
await Task.CompletedTask;
}
[ActionName("sd")]
public async Task SelectDynamicApi6Async(int i)
{
await Task.CompletedTask;
}
}
然后运行程序我们可以看到结果如下:
如果你觉得还可以通过NuGet包下载OpenDeepSpace.DynamicApi尝试吧