From 4e1b124626f36e3bdac749a75ab509ed8f1a2efb Mon Sep 17 00:00:00 2001 From: xiao Date: Fri, 31 May 2024 11:10:41 +0800 Subject: [PATCH 1/2] tj --- ...61\347\232\204\344\275\277\347\224\250.md" | 36 +++++++++ ...8 \350\277\207\346\273\244\345\231\250.md" | 74 +++++++++++++++++++ ...41\347\220\206\347\263\273\347\273\237.md" | 72 ++++++++++++++++++ ...41\347\220\206\347\263\273\347\273\237.md" | 11 +++ 4 files changed, 193 insertions(+) create mode 100644 "\350\202\226\346\226\207\346\205\247/20240527 \350\267\257\347\224\261\347\232\204\344\275\277\347\224\250.md" create mode 100644 "\350\202\226\346\226\207\346\205\247/20240528 \350\277\207\346\273\244\345\231\250.md" create mode 100644 "\350\202\226\346\226\207\346\205\247/20240530 \345\233\276\344\271\246\347\256\241\347\220\206\347\263\273\347\273\237.md" create mode 100644 "\350\202\226\346\226\207\346\205\247/20240531 \345\233\276\344\271\246\347\256\241\347\220\206\347\263\273\347\273\237.md" diff --git "a/\350\202\226\346\226\207\346\205\247/20240527 \350\267\257\347\224\261\347\232\204\344\275\277\347\224\250.md" "b/\350\202\226\346\226\207\346\205\247/20240527 \350\267\257\347\224\261\347\232\204\344\275\277\347\224\250.md" new file mode 100644 index 0000000..c068509 --- /dev/null +++ "b/\350\202\226\346\226\207\346\205\247/20240527 \350\267\257\347\224\261\347\232\204\344\275\277\347\224\250.md" @@ -0,0 +1,36 @@ +## 路由的使用 + +### 概念 +路由负责匹配传入的 HTTP 请求,然后将这些请求发送到应用的可执行终结点。 终结点是应用的可执行请求处理代码单元。 终结点在应用中进行定义,并在应用启动时进行配置。 终结点匹配过程可以从请求的 URL 中提取值,并为请求处理提供这些值。 通过使用应用中的终结点信息,路由还能生成映射到终结点的 URL。 + +### 终结点 + +1. 匹配和执行的终结点在 UseEndpoints 中进行配置。 + +```c# + +app.MapGet("/hello/{name:alpha}", (string name) => $"Hello {name}!"); + +/hello/{name:alpha} 字符串是一个路由模板。 路由模板用于配置终结点的匹配方式。 在这种情况下,模板将匹配: + +类似 /hello/Docs 的 URL +以 /hello/ 开头、后跟一系列字母字符的任何 URL 路径。 :alpha 应用仅匹配字母字符的路由约束。 +URL 路径的第二段 {name:alpha}: + +绑定到 name 参数。 +捕获并存储在 HttpRequest.RouteValues 中。 +``` + + +### 路由模版 +```c# +|路由模板 |示例匹配 URI |请求 URI…| +|hello |/hello |仅匹配单个路径 /hello。| +|{Page=Home} |/ |匹配并将 Page 设置为 Home|。 +|{Page=Home} |/Contact |匹配并将 Page 设置为 Contact。| +|{controller}/{action}/{id?}| /Products/List |映射到 Products 控制器和 List 操作。| +|{controller}/{action}/{id?} |/Products/Details/123 |映射到 Products 控制器和 Details 操作,并将 id 设置为 123。| +|{controller=Home}/{action=Index}/{id?} / |映射到 Home 控制器和 Index 方法。 |id 将被忽略。| +|{controller=Home}/{action=Index}/{id?}| /Products| 映射到 Products 控制器和 Index 方法。 |id 将被忽略。| + +``` \ No newline at end of file diff --git "a/\350\202\226\346\226\207\346\205\247/20240528 \350\277\207\346\273\244\345\231\250.md" "b/\350\202\226\346\226\207\346\205\247/20240528 \350\277\207\346\273\244\345\231\250.md" new file mode 100644 index 0000000..e1b7f25 --- /dev/null +++ "b/\350\202\226\346\226\207\346\205\247/20240528 \350\277\207\346\273\244\345\231\250.md" @@ -0,0 +1,74 @@ +## 过滤器 + +### + +在WEB Api中,引入了面向切面编程(AOP)的思想,在某些特定的位置可以插入特定的Filter进行过程拦截处理。引入了这一机制可以更好地践行DRY(Don’t Repeat Yourself)思想,通过Filter能统一地对一些通用逻辑进行处理,如:权限校验、参数加解密、参数校验等方面我们都可以利用这一特性进行统一处理 + +### Filter的种类 +```c# +每种过滤器类型都在过滤器管道中的不同阶段执行: + +授权过滤器: + 首先运行。 + 确定用户是否获得请求授权。 + 如果请求未获授权,可以让管道短路。 + +资源过滤器: + 授权后运行。 + OnResourceExecuting 在过滤器管道的其余阶段之前运行代码。 例如,OnResourceExecuting 在模型绑定之前运行代码。 + OnResourceExecuted 在管道的其余阶段完成之后运行代码。 + +操作过滤器: + 在调用操作方法之前和之后立即运行。 + 可以更改传递到操作中的参数。 + 可以更改从操作返回的结果。 + 不可在 Razor Pages 中使用。 + +终结点过滤器: + 在调用操作方法之前和之后立即运行。 + 可以更改传递到操作中的参数。 + 可以更改从操作返回的结果。 + 不可在 Razor Pages 中使用。 + 可以在操作和基于路由处理程序的终结点上调用。 + 异常过滤器在向响应正文写入任何内容之前,对未经处理的异常应用全局策略。 + +结果过滤器: + 在执行操作结果之前和之后立即运行。 + 仅当操作方法成功执行时才会运行。 + 对于必须围绕视图或格式化程序的执行的逻辑,会很有用。 +``` + +### 实现 + +```c# +过滤器通过不同的接口定义支持同步和异步实现。 + +同步过滤器在其管道阶段之前和之后运行。 例如,OnActionExecuting 在调用操作方法之前调用。 OnActionExecuted 在操作方法返回之后调用: +public class SampleActionFilter : IActionFilter +{ + public void OnActionExecuting(ActionExecutingContext context) + { + // Do something before the action executes. + } + + public void OnActionExecuted(ActionExecutedContext context) + { + // Do something after the action executes. + } +} + + + +异步过滤器定义 On-Stage-ExecutionAsync 方法。 例如,OnActionExecutionAsync: +public class SampleAsyncActionFilter : IAsyncActionFilter +{ + public async Task OnActionExecutionAsync( + ActionExecutingContext context, ActionExecutionDelegate next) + { + // Do something before the action executes. + await next(); + // Do something after the action executes. + } +} +在前面的代码中,SampleAsyncActionFilter 具有执行操作方法的 ActionExecutionDelegate (next)。 +``` \ No newline at end of file diff --git "a/\350\202\226\346\226\207\346\205\247/20240530 \345\233\276\344\271\246\347\256\241\347\220\206\347\263\273\347\273\237.md" "b/\350\202\226\346\226\207\346\205\247/20240530 \345\233\276\344\271\246\347\256\241\347\220\206\347\263\273\347\273\237.md" new file mode 100644 index 0000000..9d8d17f --- /dev/null +++ "b/\350\202\226\346\226\207\346\205\247/20240530 \345\233\276\344\271\246\347\256\241\347\220\206\347\263\273\347\273\237.md" @@ -0,0 +1,72 @@ +## 设计 + +搭建Api + +模型定义 + +创建内存数据库 + +## 实现 + +```c# +using Microsoft.AspNetCore.Mvc; + +namespace BookStore.Api.Controller; + +[ApiController] +[Route("api/authors/{authorId}/[controller]/")] +public class BooksController : ControllerBase +{ + [HttpGet("{bookId?}")] + public IActionResult Get(int authorId,int bookId) + { + return Ok(new {authorId, bookId}); + } + + [HttpPost] + public IActionResult Post(int authorId) + { + return Ok(); + } + + [HttpPut("{id}")] + public IActionResult Put(int authorId,int id) + { + return Ok(id); + } + + [HttpDelete("{id}")] + public IActionResult Del(int authorId,int id) + { + return Ok(id); + } +} +``` + + +```c# +namespace BookStore.Api.Domain; + +public class Books +{ + public Guid Id { get; set; } + public string BookName { get; set; } = null!; + public string? Publisher { get; set; }// 1=男 2=女 + public int Price { get; set; } +} + +``` + +```c# +using BookStore.Api.Domain; + +namespace BookStore.Api.Db; + +public class BookStoreDb +{ + public static BookStoreDb Instance { get; set; } = new BookStoreDb(); + + public ICollection Authors { get; set; } = new List(); + public ICollection Books { get; set; } = new List(); +} +``` \ No newline at end of file diff --git "a/\350\202\226\346\226\207\346\205\247/20240531 \345\233\276\344\271\246\347\256\241\347\220\206\347\263\273\347\273\237.md" "b/\350\202\226\346\226\207\346\205\247/20240531 \345\233\276\344\271\246\347\256\241\347\220\206\347\263\273\347\273\237.md" new file mode 100644 index 0000000..303b878 --- /dev/null +++ "b/\350\202\226\346\226\207\346\205\247/20240531 \345\233\276\344\271\246\347\256\241\347\220\206\347\263\273\347\273\237.md" @@ -0,0 +1,11 @@ +## 设计 + +编写接口 + +编写根据ID或查找所有图书信息 + +## 实现 + +```c# + +``` \ No newline at end of file -- Gitee From 97e4b15da23fb013e1b62afb2742af2f4fdd0ed4 Mon Sep 17 00:00:00 2001 From: xiao Date: Sun, 2 Jun 2024 22:03:01 +0800 Subject: [PATCH 2/2] tj --- ...41\347\220\206\347\263\273\347\273\237.md" | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git "a/\350\202\226\346\226\207\346\205\247/20240531 \345\233\276\344\271\246\347\256\241\347\220\206\347\263\273\347\273\237.md" "b/\350\202\226\346\226\207\346\205\247/20240531 \345\233\276\344\271\246\347\256\241\347\220\206\347\263\273\347\273\237.md" index 303b878..fa7a790 100644 --- "a/\350\202\226\346\226\207\346\205\247/20240531 \345\233\276\344\271\246\347\256\241\347\220\206\347\263\273\347\273\237.md" +++ "b/\350\202\226\346\226\207\346\205\247/20240531 \345\233\276\344\271\246\347\256\241\347\220\206\347\263\273\347\273\237.md" @@ -8,4 +8,50 @@ ```c# + //通过Id获取所有作者的实现 + 实例对象? GetAuthorById(Guid guid); + + //获取所有作者的方法 + //函数三要素(函数名,形参,返回值) + ICollection<实例对象> GetAllAuthors(); +实例名Repository + + 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); + } + } +控制器 + + 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 + + public void ConfigureServices(IServiceCollection services) + { + services.AddControllers(); + //新加 + services.AddScoped(); + } ``` \ No newline at end of file -- Gitee