pda-team / panda.dynamicwebapi Goto Github PK
View Code? Open in Web Editor NEWASP.NET Core Dynamic Restful WebApi. Generating WebApi from Classes. Such as: Direct Generation of WebApi Based on Business Logic Layer.
License: Apache License 2.0
ASP.NET Core Dynamic Restful WebApi. Generating WebApi from Classes. Such as: Direct Generation of WebApi Based on Business Logic Layer.
License: Apache License 2.0
作者发布一个.net standard 2.1版本
产生原因:继承仓储服务
/// <summary>
/// 用户服务
/// </summary>
[ApiExplorerSettings(GroupName = "user")]
[DynamicWebApi]
public class UserService : BaseRepository<User>, IDynamicWebApi
{
/// <summary>
/// 添加用户
/// </summary>
/// <returns></returns>
[HttpPost]
public async Task AddUser(UserRegisterRequestDto dto)
{
var user = new User()
{
Account = dto.Account,
UserName = dto.UserName,
Password = dto.Password,
};
await InsertAsync(user);
}
}
public class BaseRepository : SimpleClient where T : class, new()
{
public BaseRepository(ISqlSugarClient? context = null) : base(context)
{
base.Context=context;
}
}
只要继承BaseRepository swagger就出不来了,难道只能构造注入一下?
服务层方法,自动生成API 成功,原来在服务层方法上 用Autofac 实现了AOP,现在失效了,请问怎么处理?急解决!!!感谢大佬
/// <summary> /// 删除用户信息 /// </summary> /// <param name="input"></param> /// <returns></returns> Task DeleteUser(User input);
运行项目构建Swagger文档时,构建失败!
打开页面是错误信息如下:
Failed to load API definition.
Errors
Hide
Fetch errorInternal Server Error /swagger/v1/swagger.json
非常感谢您提供这么棒的自动生成接口的库。由于我们的产品是SaaS和聚合API模式,每一个版本都有很多用户,也就涉及到多版本控制,目前我们通过Swagger+微软的api version来实现多版本控制的。
请问您这个是否可以做到多版本配置?
请教各位道友,帮忙看下可能是哪里问题,不胜感激!
后台改来改去,不见效果,Swagger UI 页面测试也是一样,
我就在 $.ajax 上修修改改,有时候会返回个 415.。。
我在 OrchardCore项目中使用 Panda.DynamicWebApi 包,
前者是一个多模块多租户的CMS系统,它包含了授权等功能
我在A模块中创建了一个基类 用于处理所有 AppService
然后在B模块中的Service继承这个类
基类签名如下:
[DynamicWebApi]
public class AppServcieBase : IAppServcieBase, IDynamicWebApi
{
}
在该模块的 Startup 中做了如下处理 (注意:这里是模块的Startup,不是主项目的Startup,它是一个模块的启动器)
public class Startup : StartupBase
{
private readonly IShellConfiguration _shellConfiguration;
public Startup(IShellConfiguration shellConfiguration)
{
_shellConfiguration = shellConfiguration;
}
public override void ConfigureServices(IServiceCollection services)
{
services.AddAutoMapper(GetType().Assembly);
AppServcieBase.ServiceProvider = services.BuildServiceProvider();
////自定义配置
services.AddDynamicWebApi((options) =>
{
// 指定全局默认的 api 前缀
options.DefaultApiPrefix = "api";
//options.ActionRouteFactory = new ServiceActionRouteFactory();
});
// 注册Swagger生成器,定义一个和多个Swagger 文档
services.AddSwaggerGen(options =>
{
options.CustomSchemaIds(type => type.FullName);
options.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo()
{ Title = " Dynamic WebApi", Version = "v1" });
//options.SchemaGeneratorOptions.
// TODO:一定要返回true!
options.DocInclusionPredicate((docName, description) => true);
var baseDirectory = AppDomain.CurrentDomain.BaseDirectory;
var xmlDocFiles = Directory.GetFiles(baseDirectory, "*.xml");
foreach (var xmlFile in xmlDocFiles)
{
var asName = Path.GetFileNameWithoutExtension(xmlFile);
if (File.Exists(Path.Combine(baseDirectory, asName + ".dll")))
{
var xmlPath = Path.Combine(baseDirectory, xmlFile);
options.IncludeXmlComments(xmlPath);
}
}
});
}
B模块中的AppService 如下 ,Swagger API也能正常显示,Get请求交互也都没问题。
[DynamicWebApi] //加不加都一样
public class RDBMSAppService : AppServcieBase, IRDBMSAppService, IDynamicWebApi //接口也是加不加都一样
{
//这个方法无法使用 POST 请求
public async Task<bool> AlterContentTypeAsync(ImportJsonInupt model){
return false;
}
}
我尝试自己创建一个 ApiController ,执行起来没有任何问题。
产生原因:继承仓库服务
/// <summary> /// 用户服务 /// </summary> [ApiExplorerSettings(GroupName = "user")] [DynamicWebApi] public class UserService : BaseRepository<User>, IDynamicWebApi { /// <summary> /// 添加用户 /// </summary> /// <returns></returns> [HttpPost] public async Task AddUser(UserRegisterRequestDto dto) { var user = new User() { Account = dto.Account, UserName = dto.UserName, Password = dto.Password, }; await InsertAsync(user); } }
只要继承BaseRepository swagger就出不来了,难道只能构造注入一下?
试了下好像只能将Service写在MVC项目下,那如果我有另外一个层,写Service,好像不能动态生成?
希望指点一二。
试了下不支持多版本控制,如:/api/v1/service1,
/api/v2/service1,
我看了下abp的代码好像有个AddAbpApiVersioning,可以研究下把它引进来,不然没法用
您好,我新建了一个.net core 3.1 web程序,并引用了panda.dynamicwebapi,采用了abp的设计理念,将动态api类放置了Application层里面,站点默认开启的是cookie认证,在Application层实现IDynamicWebApi的服务类中,标记了[Authorize],也起到了cookie拦截的作用。
现在有个外部客户端需要调用动态api里面的接口,这个时候就要考虑使用jwt认证,之前有做过webapi的 jwt的认证,不过混合在一起使用的话,需要指定认证类型才可以
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)],那么动态生成的webapi接口中,同一个方法要怎么实现 既支持cookie,又支持jwt方式呢?
你问我为什么abp vnext切换成了新模式,那是因为它选择放弃了传统的不是前后端分离开发,而我的意思是保留了原有的和现在的模式。两种都支持!
这个issue你无需回复了!我对你的技术表示认可,但对你刚刚关闭Issue的行为觉得非常可耻!
1.接口有的参数是从Controller 基类获取,是否可配置?
2.构造函数注入方式?
How to apply the authentication and Authorization. Could you please provide the sample code?
Thanks
Duy
现在支持文件上传吗?
/// <summary> /// 删除用户信息 /// </summary> /// <param name="input"></param> /// <returns></returns> Task DeleteUser(User input);
运行项目构建Swagger文档时,构建失败!
打开页面是错误信息如下:
Failed to load API definition.
Errors
Hide
Fetch errorInternal Server Error /swagger/v1/swagger.json
比如我有两个方法:
1,GetUser
2,CreateUser
你这个API就解析成了/api/user/user,一个GET ,一个post而已,这样使用是没什么问题,但感觉就是有点别扭,或者做成可配置的也可以
你好,首先感谢分享!示例代码可以完整运行。对此,我有些疑问,在abp架构**中,业务逻辑是在application中完成的,也就是application是单独的一个类库,并非是把AppleAppService 和 IApplicationService 放在 webapi项目中的。另外我再请教一下,Framework平台下是否能够单独实现DynamicWebApi?我尝试着将framework平台下abp里面的动态api分离出来,但是好像不行。。。
比如我的返回值只是一个 int, 现在返回的Body是 1,但实际Api应该返回调用结果,以及错误信息
我需要Api 返回的是包含一个状态标记的 Flag,以及一个 Data ,真正的返回数据,如下
{ Flag: true, Data:1 }
我看到可以定义方法的属性标签 ProducesResponseType ,但实际上接口太多,无法逐个去修改,有什么好的方式?
在WebApi中,ModelState.IsVaild会自动执行,但是通过动态WebApi后ModelState.IsVaild验证功能没有启用。
能否支持Swagger5.0版本
按照源码默认运行时,在Service中继承了IDynamicWebApi的服务类并没有生成swagger文档
改用services.AddDynamicWebApi()时,启动报错:
Microsoft.AspNetCore.Hosting.Diagnostics[6]
Application startup exception
System.NullReferenceException: Object reference not set to an instance of an object.
at Panda.DynamicWebApiSample.Dynamic.ServiceActionRouteFactory.CreateActionRouteModel(String areaName, String controllerName, ActionModel action) in C:\Users\Administrator\Downloads\Panda.DynamicWebApi-master\Panda.DynamicWebApi-master\samples\Panda.DynamicWebApiSample\Dynamic\ServiceActionRouteFactory.cs:line 17
at Panda.DynamicWebApi.DynamicWebApiConvention.CreateActionRouteModel(String areaName, String controllerName, ActionModel action) in C:\Users\Administrator\Downloads\Panda.DynamicWebApi-master\Panda.DynamicWebApi-master\src\Panda.DynamicWebApi\DynamicWebApiConvention.cs:line 345
at Panda.DynamicWebApi.DynamicWebApiConvention.NormalizeSelectorRoutes(String areaName, String controllerName, ActionModel action) in C:\Users\Administrator\Downloads\Panda.DynamicWebApi-master\Panda.DynamicWebApi-master\src\Panda.DynamicWebApi\DynamicWebApiConvention.cs:line 321
at Panda.DynamicWebApi.DynamicWebApiConvention.ConfigureSelector(String areaName, String controllerName, ActionModel action) in C:\Users\Administrator\Downloads\Panda.DynamicWebApi-master\Panda.DynamicWebApi-master\src\Panda.DynamicWebApi\DynamicWebApiConvention.cs:line 233
at Panda.DynamicWebApi.DynamicWebApiConvention.ConfigureSelector(ControllerModel controller, DynamicWebApiAttribute controllerAttr) in C:\Users\Administrator\Downloads\Panda.DynamicWebApi-master\Panda.DynamicWebApi-master\src\Panda.DynamicWebApi\DynamicWebApiConvention.cs:line 212
at Panda.DynamicWebApi.DynamicWebApiConvention.ConfigureDynamicWebApi(ControllerModel controller, DynamicWebApiAttribute controllerAttr) in C:\Users\Administrator\Downloads\Panda.DynamicWebApi-master\Panda.DynamicWebApi-master\src\Panda.DynamicWebApi\DynamicWebApiConvention.cs:line 83
at Panda.DynamicWebApi.DynamicWebApiConvention.Apply(ApplicationModel application) in C:\Users\Administrator\Downloads\Panda.DynamicWebApi-master\Panda.DynamicWebApi-master\src\Panda.DynamicWebApi\DynamicWebApiConvention.cs:line 45
平台版本是.net core3.1,DynamicWebApi升级到了1.0.3
在测试时候发现异步方法动态api失效了,请求会全部返回415状态,经过测试复现的情况如下:
1、前提条件是使用的异步方法,返回值是 async Task或者直接Task
2、第二个条件是必须有对象类型的参数
以自带的demo为例,:
public IEnumerable<string> GetAllAsync(UpdateAppleDto dto);
public IEnumerable<string> GetAllAsync(int id);
public async Task<IEnumerable<string>> GetAllAsync(int id);
这几种写法都是正常的,但如果使用下面的写法,则均不可用
public async Task<IEnumerable<string>> GetAllAsync(UpdateAppleDto dto);
产生原因:继承仓库服务
/// <summary> /// 用户服务 /// </summary> [ApiExplorerSettings(GroupName = "user")] [DynamicWebApi] public class UserService : BaseRepository<User>, IDynamicWebApi { /// <summary> /// 添加用户 /// </summary> /// <returns></returns> [HttpPost] public async Task AddUser(UserRegisterRequestDto dto) { var user = new User() { Account = dto.Account, UserName = dto.UserName, Password = dto.Password, }; await InsertAsync(user); } }
只要继承BaseRepository swagger就出不来了,难道只能构造注入一下?
无。
默认会根据你的方法名字来设置HTTP动词,如 CreateApple 或者 Create 生成的API动词为 POST,对照表如下,若命中(忽略大小写)对照表那么该API的名称中的这部分将会被省略,如 CreateApple 将会变成 Apple,如未在以下对照表中,将会使用默认动词 POST
我有个方法是getbyid,改了以后变成byid,我想还是用getbyid,请问如何禁用该设置;
如题所示,不是很明白加特性 [DynamicWebApi] 是不是有点多余呢?
你好,我看到您之前有讲述过 autofac的动态代理,也有看过博客文章https://www.cnblogs.com/stulzq/p/8547839.html,请问您有时间提供一套framework版的动态webapi吗
因为都是post的,删掉update,create等等关键字结果都不知道哪个是哪个
// options.IncludeXmlComments(@"bin\Debug\netcoreapp2.2\Panda.DynamicWebApiSample.xml");
options.IncludeXmlComments($"{Assembly.GetExecutingAssembly().GetName().Name}.xml");
同时重新生成“xml”描述文件
请支持 netcore 3.1 ,我们想在项目里使用一下
.net core 3.0 之后,HttpMethodActionConstraint已经设置为私有方法,导致3.0程序集中无法找到该程序集出错。
官方Issue:dotnet/aspnetcore#8653
控制器接口没有生成注释
Swagger 展示出来了 但是调用报错 404是什么原因
as title. what kind scenario use this way better? 😄
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.