diff --git a/readme.md b/readme.md deleted file mode 100644 index f066c0b9a1d775181432615955cb65de1ce292e0..0000000000000000000000000000000000000000 --- a/readme.md +++ /dev/null @@ -1,3 +0,0 @@ -## 22级net前端班 WebApi课堂笔记 - -上课录屏地址:https://www.alipan.com/s/G2xKzaGETfN \ No newline at end of file diff --git "a/\345\262\263\345\274\272/20240523 - \347\254\224\350\256\260-\344\276\235\350\265\226\346\263\250\345\205\245.md" "b/\345\262\263\345\274\272/20240512-\347\254\224\350\256\260-\344\276\235\350\265\226\346\263\250\345\205\245.md" similarity index 86% rename from "\345\262\263\345\274\272/20240523 - \347\254\224\350\256\260-\344\276\235\350\265\226\346\263\250\345\205\245.md" rename to "\345\262\263\345\274\272/20240512-\347\254\224\350\256\260-\344\276\235\350\265\226\346\263\250\345\205\245.md" index 06b58a769a58662104354cd2ecdc8e4522f5860d..855bdc1acfb8b19c817aadd433538cd84dcffa25 100644 --- "a/\345\262\263\345\274\272/20240523 - \347\254\224\350\256\260-\344\276\235\350\265\226\346\263\250\345\205\245.md" +++ "b/\345\262\263\345\274\272/20240512-\347\254\224\350\256\260-\344\276\235\350\265\226\346\263\250\345\205\245.md" @@ -1,5 +1,5 @@ # 依赖注入 -依赖注入(Dependency Injection,DI)是.NET Core应用程序中常用的设计模式,用于管理和提供应用程序需要的依赖项。在API .NET Core中,依赖注入可用于将服务(services)注入到控制器、中间件、过滤器等组件中。以下是有关API .NET Core依赖注入的知识点和示例: +依赖注入的(Dependency Injection,DI)是.NET Core应用程序中常用的设计模式,用于管理和提供应用程序需要的依赖项。在API .NET Core中,依赖注入可用于将服务(services)注入到控制器、中间件、过滤器等组件中。以下是有关API .NET Core依赖注入的知识点和示例: 1. 依赖注入容器:在.NET Core中,依赖注入容器负责管理应用程序中的依赖关系,用于解析所需的服务实例。一个常用的依赖注入容器是.NET Core内置的IServiceProvider接口。 diff --git "a/\345\262\263\345\274\272/20240514 - \347\254\224\350\256\260-webapi\347\232\204\346\246\202\345\277\265.md" "b/\345\262\263\345\274\272/20240514-\347\254\224\350\256\260-webapi\347\232\204\346\246\202\345\277\265.md" similarity index 100% rename from "\345\262\263\345\274\272/20240514 - \347\254\224\350\256\260-webapi\347\232\204\346\246\202\345\277\265.md" rename to "\345\262\263\345\274\272/20240514-\347\254\224\350\256\260-webapi\347\232\204\346\246\202\345\277\265.md" diff --git "a/\345\262\263\345\274\272/20240520 - \347\254\224\350\256\260-net core\345\222\214api.md" "b/\345\262\263\345\274\272/20240520-\347\254\224\350\256\260-net core\345\222\214api.md" similarity index 100% rename from "\345\262\263\345\274\272/20240520 - \347\254\224\350\256\260-net core\345\222\214api.md" rename to "\345\262\263\345\274\272/20240520-\347\254\224\350\256\260-net core\345\222\214api.md" diff --git "a/\345\262\263\345\274\272/20240521 - \347\254\224\350\256\260-\344\270\255\351\227\264\344\273\266.md" "b/\345\262\263\345\274\272/20240521-\347\254\224\350\256\260-\344\270\255\351\227\264\344\273\266.md" similarity index 100% rename from "\345\262\263\345\274\272/20240521 - \347\254\224\350\256\260-\344\270\255\351\227\264\344\273\266.md" rename to "\345\262\263\345\274\272/20240521-\347\254\224\350\256\260-\344\270\255\351\227\264\344\273\266.md" diff --git "a/\345\262\263\345\274\272/20240524 - \347\254\224\350\256\260-\345\244\215\344\271\240.md" "b/\345\262\263\345\274\272/20240524-\347\254\224\350\256\260-\345\244\215\344\271\240.md" similarity index 100% rename from "\345\262\263\345\274\272/20240524 - \347\254\224\350\256\260-\345\244\215\344\271\240.md" rename to "\345\262\263\345\274\272/20240524-\347\254\224\350\256\260-\345\244\215\344\271\240.md" diff --git "a/\345\262\263\345\274\272/20240527-\347\254\224\350\256\260-\350\267\257\347\224\261.md" "b/\345\262\263\345\274\272/20240527-\347\254\224\350\256\260-\350\267\257\347\224\261.md" new file mode 100644 index 0000000000000000000000000000000000000000..5b9c583a5385ca6a00567925c5e375813323022f --- /dev/null +++ "b/\345\262\263\345\274\272/20240527-\347\254\224\350\256\260-\350\267\257\347\224\261.md" @@ -0,0 +1,77 @@ +## IActionResult 和 ActionResult + +IActionResult 和 ActionResult 都用于表示控制器方法的返回结果,但它们有一些区别: + +1. IActionResult: 是 ASP.NET Core 中所有控制器方法返回类型的基本接口。 +它代表一个可以执行的操作结果,可以是任何类型的结果,例如视图、重定向、JSON 数据等。 +使用 IActionResult 作为返回类型可以使控制器方法更加灵活,可以根据需要返回不同类型的结果。 + +2. ActionResult : 是 IActionResult 的泛型版本,其中 T 表示返回结果的类型。 +ActionResult 是一个带有数据的特定类型的操作结果,通常用于返回包含数据的结果,如 JSON 数据、视图模型等。 + +使用 ActionResult 可以更方便地返回带有数据的结果,并且在编码时提供了更好的类型安全性。 + +3. 区别总结: + +- IActionResult 是通用的操作结果接口,可以返回任何类型的结果。 +- ActionResult 是带有数据的特定类型的操作结果,提供更好的类型安全性和便利性。 + +在实际开发中,你可以根据需要选择使用 IActionResult 或 ActionResult 。如果你的方法需要返回不同类型的结果,你可以使用 IActionResult;如果方法需要返回特定类型的数据结果,你可以使用 ActionResult 。 + +### 模型绑定 +Action特性: + +- [FromQuery]:从HTTP请求的查询字符串中获取参数的值 +- [FromForm]:从表单中获取参数的值 +- [FromHeader]:从HTTP 请求的头部信息中获取参数值 +- [FromBody]:从请求的内容体获取参数值 +- [FromServices]:从依赖注入容器中获取参数值 +- [FromRoute]:从路由中获取参数值 +- [BindRequiredAttribute]:如果没有值绑定到此参数,或绑定不成功,这个特性将添加一个ModelState错误 + +另外,看可以添加[ApiController]位于命名空间下方,会尝试自动获取参数值,不再需要为参数指定上述其他特性 + +### 模型验证 +使用Required特性为属性添加需要的数据验证 +``` +[Required(ErrorMessage)="标题属性不能为空"] +[MinLength(20,ReeroMessage="标题不能少于20个字符")] +public string Title{get;set;} +``` + +### 实现一个简易的CRUD +``` +using Microsoft.AspNetCore.Mvc; + +namespace Admin2024.api; +[ApiController] +//定义路由,[controller]代指`/blog` +[Route("[controller]")] +public class BlogController : ControllerBase +{ + //获取到所有或者指定id的数据 + [HttpGet("{id?}")] + public IActionResult Index(int id) + { + return Ok(new {Data=id}); + } + //保存数据,BlogDto为定义的实体类对象,注意返回类型为ActionResult<实体类对象> + [HttpPost] + public ActionResult Edit(BlogDto blogDto) + { + return blogDto; + } + //删除数据 + [HttpDelete] + public IActionResult Delete() + { + return Ok(new {Code=3000,Msg="删除成功"}); + } + //修改数据,BlogDto为定义的实体类对象,注意返回类型为ActionResult<实体类对象> + [HttpPut("{id}")] + public ActionResult Put(int id,BlogDto blogDto) + { + return Ok(new {Code=3000,Msg="修改成功",id=id,Data=blogDto}); + } +} +``` \ No newline at end of file diff --git "a/\345\262\263\345\274\272/20240528-\347\254\224\350\256\260-\350\277\207\346\273\244\345\231\250.md" "b/\345\262\263\345\274\272/20240528-\347\254\224\350\256\260-\350\277\207\346\273\244\345\231\250.md" new file mode 100644 index 0000000000000000000000000000000000000000..869207e4ceb686107a05d7f8ccc8cd2239fd2c4c --- /dev/null +++ "b/\345\262\263\345\274\272/20240528-\347\254\224\350\256\260-\350\277\207\346\273\244\345\231\250.md" @@ -0,0 +1,116 @@ +### 路由 +1. 在控制器上写上两个特性 [ApiController].[Route("/api/..")] +2. 如果不符合restfull风格的路由的话,在action上单独写路由 +[HttpGet("/api/...")] + +### 关于匹配到函数的处理 +- 入参:函数的参数,模型绑定 +- 出参:返回的响应,1.状态码 2.带对象的状态码 3.重定向 4.内容:{Code:1000,data:[],msg:"请求成功"} + +### 过滤器 +过滤器和中间件相似,能够在某些功能前后执行,通常用于执行日志记录、身份验证、授权、异常处理和结果转换等操作 + +ASP.NET Core中提供了五种类型的过滤器: +- 授权过滤器(Authorization Filter):最先执行,用于检查用户是否有权访问资源,并在未经授权时拦截请求,实现IAsyncAuthorizationFilter或IAuthorizationFilter接口 +- 资源过滤器(Resource Filter):在Authorization后执行,并在其他过滤器之前和之后执行,实现IAsyncResourceFilter或IResourceFilter接口 +- 动作过滤器(Action Filter):在执行Action之前或之后执行自定义逻辑,而且在模型绑定后执行,实现IAsyncActionFilter或IActionFilter接口 +- 异常过滤器(Exception Filter):用于捕获并处理动作方法中抛出的异常,实现IAsyncExceptionFilter或IExceptionFilter接口 +- 结果过滤器(Result Filter):在IActionResult执行的前后执行,能够控制Action的执行结果,比如格式化结果等。需要注意的是,它只有在Action方法成功执行完成后才会运行,实现IAsyncResultFilter或IResultFilter接口 + +```c# + // 对于每次请求都需要设置return结果,这里可以使用Result过滤器格式化结果 + // 1. Dto/ApiResult.cs + public class ApiResult + { + public int Code { get; set; } + public string? Msg { get; set; } + public object Data { get; set; } + } + // 2. Filters/ApiResultFilter.cs 实现接口 + using Microsoft.AspNetCore.Mvc; + using Microsoft.AspNetCore.Mvc.Filters; + using System.Threading.Tasks; + namespace Api.Filters; + public class ApiResultFilter:IAsyncResultFilter{ + public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next) + { + // 判断返回结果是否为内容,如果是则给context.Result赋值一个新的实例对象ApiResult + if (context.Result is ObjectResult objectResult) + { + context.Result = new ObjectResult(new ApiResult + { + Code = 1000, + Msg = "请求成功", + Data = objectResult.Value + }); + } + else + { + context.Result = new ObjectResult(new ApiResult { Code = 4000, Msg = "无效请求" }); + } + // 必须记得调用,否则不能执行下一个Action + await next(); + } + } + // 3. Startup.cs 注册服务 + public void ConfigureServices(IServiceCollection services) + { + // 全局过滤 + services.AddControllers(options => { + options.Filters.Add(); + }); + } +``` + + +### 配置 +访问json配置文件 +```c# +// appsetting.json + { + "MySettings": { + "Setting1": "Value1", + "Setting2": "Value2" + } + } + // startup.cs + // IConfiguration 用于读取应用程序的配置 + private readonly IConfiguration _configuration; + public Startup(IConfiguration configuration) + { + _configuration = configuration; + } + public void Configure(IApplicationBuilder app) + { + app.UseRouting(); + app.UseEndpoints(endpoints => { + endpoints.MapControllers(); + + }); + } + public void ConfigureServices(IServiceCollection services) + { + // 输出配置值并打印到控制台 + var setting1 = _configuration["MySettings:Setting1"]; + Console.WriteLine($"Setting1: {setting1}"); + } +``` + +### 日志 +日志不会为应用程序增加实质性的功能,但是能够让开发人员跟踪程序的运行、调试程序以及记录错误信息 + +日志有两种类型: +- 系统日志:系统在运行时向外输出的记录信息 +- 用户记录日志:开发人员在程序中适当的位置调用与日志功能相关的API输出 + +由以下接口组成:(都位于Microsoft.Extensions.Logging命名空间下 +- Ilogger:实际执行记录日志操作的方法 +- IloggerProvider:用于创建ILogger对象 +- IloggerFactory:通过ILoggerProvider对象创建ILogger对象 + +日志级别: +- Trace:级别最低 +- Debug:用于记录调试信息 +- Information:用于记录应用程序的执行流程信息 +- Warning:用于记录应用程序出现的轻微错误或其他不会导致程序停止的警告信息 +- Critical:严重级别最高,用于记录引起应用程序崩溃、灾难性故障等信息 diff --git "a/\345\262\263\345\274\272/20240530-\351\241\271\347\233\256\345\210\233\345\273\272.md" "b/\345\262\263\345\274\272/20240530-\351\241\271\347\233\256\345\210\233\345\273\272.md" new file mode 100644 index 0000000000000000000000000000000000000000..f6fb30c9886b1f61818246c1395d53f4a348970c --- /dev/null +++ "b/\345\262\263\345\274\272/20240530-\351\241\271\347\233\256\345\210\233\345\273\272.md" @@ -0,0 +1,33 @@ +### 项目创建/设计 +一.主体结构: + ①:Resultfull风格的webAApi + ②:Asp.net Core 8.0 + ③:采用传统控制器模式 + +二.模型设计(图书管理系统) + 作者:(Authors) + 姓名:AuthorName + 性别:Gender + 出生年月:Birthday + + 图书: + 书名:BookName + 出版社:Publister + 作者:AuthorId + 价格:Price + +### 内存型数据库 +创建一个DB对象 +```c# + public static BookDtoreDb Instance{get;set;}=new BookStoreDb(); + public Icollection<实例对象1> 名1 {get;set;}=new List<实例对象1>(); + public Icollection<实例对象2> 名2 {get;set;}=new List<实例对象2>(); + //初始化数据 + public BookStoreDb() + { + 名1.Add(new 实例名{ + 字段1=值1, + 字段2=值2 + }) + } +``` \ No newline at end of file diff --git "a/\345\262\263\345\274\272/20240531-\347\254\224\350\256\260-\344\273\223\345\202\250\346\250\241\345\274\217.md" "b/\345\262\263\345\274\272/20240531-\347\254\224\350\256\260-\344\273\223\345\202\250\346\250\241\345\274\217.md" new file mode 100644 index 0000000000000000000000000000000000000000..6c22ab1670caba76f9ae6d4fea1fd8bf10eba1af --- /dev/null +++ "b/\345\262\263\345\274\272/20240531-\347\254\224\350\256\260-\344\273\223\345\202\250\346\250\241\345\274\217.md" @@ -0,0 +1,64 @@ +### 集合接口 +- ICollection :ICollection 接口由泛型集合类实现。使用这个接口可以获得集合中的元素个数(Conunt()),还可以从集合中添加和删除元素(Add()、Remove()、Clear())、把集合复制到数组中(CopyTo()方法) +- IList :IList 接口由于可通过位置访问其中的元素列表,这个接口定义了一个索引器,可以在集合的指定位置插入或者删除某些项(Insert()和RemovcAt()方法)。ILst 接口派生自ICollection 接口 + +### 仓储模式 +仓储模式通常指的是使用Entity Framework Core实现数据持久化 + + +### 接口 +I实例名Repository +```c# + //通过Id获取所有作者的实现 + 实例对象? GetAuthorById(Guid guid); + + //获取所有作者的方法 + //函数三要素(函数名,形参,返回值) + ICollection<实例对象> GetAllAuthors(); +``` + +实例名Repository +```c# + public class 实例名Repository:I实例名Repository + { + public ICollection<实例名> GetAllAuthors() + { + //从持久化数据库中获取 + return 名Db.Instance.实例名.ToList(); + //return [.. 名Db.Instance.实例名]; + } + public 实例名? GetAuthorById(Guid guid) + { + return 名Db.Instance.实例名.SingleOrDefault(item=>item.Id==guid); + } + } +``` + +控制器 +```c# + private readonly I实例名Repository _实例名Repository; + public 实例名Controller(I实例名Repository 实例名Repository) + { + _实例名Repository=实例名Repository; + } + //获取get的函数中 + [HttpGet("{id?}")] + public IActionResult Get(int id) + { + if(id.ToString==""){ + return Ok(_实例名Repository.GetAllAuthors()); + }else{ + return Ok(_实例名Repository.GetAuthorById(id)); + } + } +``` +Startup.cs +```c# + public void ConfigureServices(IServiceCollection services) + { + services.AddControllers(); + //新加 + services.AddScoped(); + } +``` +\ No newline at end of file \ No newline at end of file