From e4df441297d8379cc2e690064437809ce6d1d1fb Mon Sep 17 00:00:00 2001
From: 15959855625 <2575863563@qq.com>
Date: Sun, 2 Jun 2024 21:29:33 +0800
Subject: [PATCH] WebAPI-third
---
...50\345\205\245\344\273\243\347\240\201.md" | 2 +-
.../20240527-\350\267\257\347\224\261.md" | 62 +++++++++++++++
...8-\350\277\207\346\273\244\345\231\250.md" | 66 ++++++++++++++++
...30\346\225\260\346\215\256\345\272\223.md" | 76 +++++++++++++++++++
...73\347\273\237\346\216\245\345\217\243.md" | 63 +++++++++++++++
5 files changed, 268 insertions(+), 1 deletion(-)
create mode 100644 "\351\202\271\347\246\217\347\247\221/20240527-\350\267\257\347\224\261.md"
create mode 100644 "\351\202\271\347\246\217\347\247\221/20240528-\350\277\207\346\273\244\345\231\250.md"
create mode 100644 "\351\202\271\347\246\217\347\247\221/20240530-\345\206\205\345\255\230\346\225\260\346\215\256\345\272\223.md"
create mode 100644 "\351\202\271\347\246\217\347\247\221/20240531-\344\273\223\345\202\250\347\263\273\347\273\237\346\216\245\345\217\243.md"
diff --git "a/\351\202\271\347\246\217\347\247\221/20240524-\344\276\235\350\265\226\346\263\250\345\205\245\344\273\243\347\240\201.md" "b/\351\202\271\347\246\217\347\247\221/20240524-\344\276\235\350\265\226\346\263\250\345\205\245\344\273\243\347\240\201.md"
index 9e8ed23..50d0fc3 100644
--- "a/\351\202\271\347\246\217\347\247\221/20240524-\344\276\235\350\265\226\346\263\250\345\205\245\344\273\243\347\240\201.md"
+++ "b/\351\202\271\347\246\217\347\247\221/20240524-\344\276\235\350\265\226\346\263\250\345\205\245\344\273\243\347\240\201.md"
@@ -30,7 +30,7 @@ public class Startup{
///
///
public void ConfigureServices(IServiceCollection services){
- // 添加了 MVC 控制器服务,这是 mvc 核心部分
+
services.AddControllers();
}
diff --git "a/\351\202\271\347\246\217\347\247\221/20240527-\350\267\257\347\224\261.md" "b/\351\202\271\347\246\217\347\247\221/20240527-\350\267\257\347\224\261.md"
new file mode 100644
index 0000000..ad2a4e2
--- /dev/null
+++ "b/\351\202\271\347\246\217\347\247\221/20240527-\350\267\257\347\224\261.md"
@@ -0,0 +1,62 @@
+### 路由:
+```c#
+[ApiController].[Route("/api/..")]
+```
+
+### 关于匹配到函数的处理:
+1. 入参:函数的参数,模型绑定
+2. 出参:返回的响应,1.状态码 2.带对象的状态码 3.重定向 4.内容
+
+
+```c#
+Dto:BlogDto.cs
+
+namespace Admin2024.Api;
+
+public class BlogDto{
+ public string Title {get;set;}=null!;
+ public string Author {get;set;}=null!;
+ public string? Flag {get;set;}
+
+}
+```
+
+
+```c#
+BlogsController.cs:
+using Microsoft.AspNetCore.Mvc;
+
+namespace Admin2024.Api;
+
+[ApiController]
+[Route("/api/[controller]")]
+
+public class BlogsController:ControllerBase{
+//创建
+ public IActionResult Index(){
+ return Ok("你好,世界");
+ }
+
+ [Route("{id}")]
+ public IActionResult Details(int id){
+ return Ok(id);
+ }
+//新增
+ [HttpPost]
+ public ActionResult Post(BlogDto blogDto){
+ return blogDto;
+ }
+//编辑
+ [HttpPut("{id}")]
+ public ActionResult PUT(int id,BlogDto blogDto){
+ return new {id,blogDto};
+ }
+//删除
+ [HttpDelete]
+ public IActionResult Delete(int id){
+ return Ok(id);
+ }
+
+
+}
+```
\ No newline at end of file
diff --git "a/\351\202\271\347\246\217\347\247\221/20240528-\350\277\207\346\273\244\345\231\250.md" "b/\351\202\271\347\246\217\347\247\221/20240528-\350\277\207\346\273\244\345\231\250.md"
new file mode 100644
index 0000000..b04fb7f
--- /dev/null
+++ "b/\351\202\271\347\246\217\347\247\221/20240528-\350\277\207\346\273\244\345\231\250.md"
@@ -0,0 +1,66 @@
+## 过滤器
+在.NET Web API中,过滤器(Filter)是一种用于拦截和处理HTTP请求和响应的机制。过滤器可以用于执行身份验证、授权、日志记录、异常处理等任务。以下是一些关于.NET Web API过滤器的基本概念和用法:
+1. **过滤器类型**:Web API提供了几种不同类型的过滤器,包括:
+ - 授权过滤器(Authorization Filters):用于执行授权检查。
+ - 动作过滤器(Action Filters):允许在执行动作之前或之后执行代码。
+ - 异常过滤器(Exception Filters):用于处理异常。
+ - 消息过滤器(Message Filters):用于读取或修改进入或离开的HTTP消息。
+2. **创建过滤器**:自定义过滤器是通过继承相应的基类来创建的。例如,创建一个动作过滤器需要继承ActionFilterAttribute类,并重写OnActionExecuting和OnActionExecuted方法。
+3. **过滤器的注册**:过滤器可以在全局级别、控制器级别或操作级别注册。全局过滤器通过HttpConfiguration.Filters.Add方法添加,控制器级别的过滤器通过在控制器类上使用属性来注册,操作级别的过滤器则通过在操作方法上使用属性来注册。
+4. **过滤器的执行顺序**:过滤器的执行顺序遵循一定的规则。在同一个作用域内,授权过滤器最先执行,然后是动作过滤器。对于授权过滤器和动作过滤器的OnActionExecuting方法,如果有多个过滤器,它们的执行顺序是全局 -> 控制器 -> 操作。对于异常过滤器和动作过滤器的OnActionExecuted方法,执行顺序则是操作 -> 控制器 -> 全局。
+5. **最小API中的过滤器**:在.NET 6或更高版本中,最小API(Minimal APIs)提供了一种更简洁的方式来注册和使用过滤器,通过使用MapMethods和MapFilter方法。
+6. **过滤器的使用场景**:过滤器可以用于多种场景,如日志记录、请求验证、响应修改、异常处理等,它们提供了一种灵活的方式来处理Web API中的常见任务。
+
+### result 过滤器
+- Startup.cs
+```c#
+ using Filters.Filter;
+ namespace Filters;
+ public class Startup
+ {
+ public void Configure(IApplicationBuilder app)
+ {
+ app.UseRouting();
+
+ app.UseEndpoints(Endpoint=>Endpoint.MapControllers());
+ }
+ public void ConfigureServices(IServiceCollection services)
+ {
+ // 将result过滤器注入服务
+ services.AddControllers(option =>{
+ option.Filters.Add();
+ });
+ }
+ }
+```
+- ApiResultFilter.cs
+```c#
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.Filters;
+namespace Filters.Filter;
+public class ApiResultFilter : IAsyncActionFilter
+{
+ public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
+ {
+ // 参数 context 表示动作执行的上下文,它包含了请求的详细信息和动作执行的结果。
+ // 参数 next 是一个委托,用于执行管道中的下一个动作或过滤器。
+ // context 已经被隐式地使用了
+ var result = await next();
+ // 判断返回的结果是否为内容,我们就给context.Result赋一个新的实例对象 ApiRuilt
+ if (result.Result is ObjectResult objectResult)
+ {
+ result.Result = new ObjectResult(new ApiResult
+ {
+ Code = 1000,
+ Msg = "请求成功!",
+ Data = objectResult.Value
+ });
+ }
+ else
+ {
+ result.Result = new ObjectResult(new ApiResult { Code = 1001 });
+ }
+
+ }
+}
+```
diff --git "a/\351\202\271\347\246\217\347\247\221/20240530-\345\206\205\345\255\230\346\225\260\346\215\256\345\272\223.md" "b/\351\202\271\347\246\217\347\247\221/20240530-\345\206\205\345\255\230\346\225\260\346\215\256\345\272\223.md"
new file mode 100644
index 0000000..ead656a
--- /dev/null
+++ "b/\351\202\271\347\246\217\347\247\221/20240530-\345\206\205\345\255\230\346\225\260\346\215\256\345\272\223.md"
@@ -0,0 +1,76 @@
+## 资源管理
+```c#
+一.主体结构:
+ ①:Resultfull风格的webAApi
+ ②:Asp.net Core 8.0
+ ③:采用传统控制器模式
+
+二. 模型设计(图书管理系统)
+ 作者:(Authors)
+ 姓名:AuthorName
+ 性别:Gender
+ 出生年月:Birthday
+
+ 图书:
+ 书名:BookName
+ 出版社:Publister
+ 作者:AuthorId
+ 价格:Price
+
+三.内存型数据库(自定义的一个集合类)
+
+四.仓储系统(准备用来接入数据库的一套接口)
+ ①:通用型仓储接口
+ ②:个性化的仓储系统(作者的增删改查,图书的增删改查)
+
+五.利用第一步的主体结构,具体实现Resultfull风格的关于作者,图书的CRUD
+```
+
+### 内存型数据库
+- BookStoreDb.cs
+```c#
+using Library.Modal;
+namespace Library.Db;
+
+// 模拟数据库
+// 内存型数据库 - 自定义的一个集合类
+public class BookStoreDb
+{
+ // 数据库具体的实例
+ public static BookStoreDb InstanceDb { get; set; } = new BookStoreDb();
+ // 模拟数据库中的表
+ public ICollection Author {get;set;} = new List();
+ public ICollection Books {get;set;} = new List();
+}
+```
+- Modal
+ - Author.cs
+ ```c#
+ using System.ComponentModel.DataAnnotations;
+ namespace Library.Modal;
+
+ public class Author
+ {
+ [Required]
+ public int AuthorId {get;set;}
+ public string AuthorName {get;set;} = null!;
+ public int? Age {get;set;}
+ public int? Sex {get;set;}
+ public int? Phone{get;set;}
+ }
+ ```
+ - Book.cs
+ ```c#
+ using System.ComponentModel.DataAnnotations;
+ namespace Library.Modal;
+
+ public class Books
+ {
+ [Required]
+ public int BookId {get;set;}
+ public string BookName {get;set;} = null!;
+ public string? Publish {get;set;}
+ public string? Type {get;set;}
+ public int? Price{get;set;}
+ }
+ ```
\ No newline at end of file
diff --git "a/\351\202\271\347\246\217\347\247\221/20240531-\344\273\223\345\202\250\347\263\273\347\273\237\346\216\245\345\217\243.md" "b/\351\202\271\347\246\217\347\247\221/20240531-\344\273\223\345\202\250\347\263\273\347\273\237\346\216\245\345\217\243.md"
new file mode 100644
index 0000000..f3e3ae6
--- /dev/null
+++ "b/\351\202\271\347\246\217\347\247\221/20240531-\344\273\223\345\202\250\347\263\273\347\273\237\346\216\245\345\217\243.md"
@@ -0,0 +1,63 @@
+### 集合接口
+- ICollection :ICollection接口由泛型集合类实现。使用这个接口可以获得集合中的元素个数(Count()),还可以从集合中添加和删除元素(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
--
Gitee