From 984b15f1c3b56ac1d21356f23b150211991c6e0f Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 2 Jun 2024 17:49:16 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E7=AC=94=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2024.05.27-\350\267\257\347\224\261.md" | 108 ++++++++++++++++++ ...8-\350\277\207\346\273\244\345\231\250.md" | 48 ++++++++ ...0240520-NETCore\345\222\214ASP.NETCore.md" | 65 +++++++++++ ...1-\344\270\255\351\227\264\344\273\266.md" | 56 +++++++++ ...35\350\265\226\346\263\250\345\205\245.md" | 15 +++ ...0240524-webapi\346\226\260\347\211\210.md" | 57 +++++++++ ...71\347\233\256\350\256\276\350\256\241.md" | 27 +++++ ...41\347\220\206\347\263\273\347\273\237.md" | 105 +++++++++++++++++ 8 files changed, 481 insertions(+) create mode 100644 "\351\231\210\345\237\271\346\235\260/2024.05.27-\350\267\257\347\224\261.md" create mode 100644 "\351\231\210\345\237\271\346\235\260/2024.05.28-\350\277\207\346\273\244\345\231\250.md" create mode 100644 "\351\231\210\345\237\271\346\235\260/20240530_\351\241\271\347\233\256\350\256\276\350\256\241.md" create mode 100644 "\351\231\210\345\237\271\346\235\260/20240531-\345\233\276\344\271\246\351\246\206\347\256\241\347\220\206\347\263\273\347\273\237.md" diff --git "a/\351\231\210\345\237\271\346\235\260/2024.05.27-\350\267\257\347\224\261.md" "b/\351\231\210\345\237\271\346\235\260/2024.05.27-\350\267\257\347\224\261.md" new file mode 100644 index 0000000..29b0a14 --- /dev/null +++ "b/\351\231\210\345\237\271\346\235\260/2024.05.27-\350\267\257\347\224\261.md" @@ -0,0 +1,108 @@ +``` +路由:1.在控制器上写上两个特性 [ApiController].[Route("/api/..")] + +2.如果不符合restfull风格的路由的话,在action上单独写路由 +[HttpGet("/api/...")] +``` + +``` +关于匹配到函数的处理: +入参:函数的参数,模型绑定 +出参:返回的响应,1.状态码 2.带对象的状态码 3.重定向 4.内容:{Code:1000,data:[],msg:"请求成功"} + + +``` + + +``` +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;} + +} +``` + + +``` +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); + } + + +} +``` + + +``` +http: +@url=http://localhost:5000 + +### +GET {{url}}/api/books +Accept: application/json + +### +GET {{url}}/api/blogs/1 HTTP/1.1 + + +### +POST {{url}}/api/blogs HTTP/1.1 +Content-Type: application/json + +{ + "title":"晚上又和", + "author":"驾驶证", + "flag":"绝对是" +} + +### +PUT {{url}}/api/blogs/11 HTTP/1.1 +Content-Type: application/json + +{ + "title":"jjjjj", + "author":"驾驶证", + "flag":"dsz" +} + +### +DELETE {{url}}/api/blogs/12 HTTP/1.1 + +### +GET {{url}}/api/books/77/blogs/88 HTTP/1.1 +``` \ No newline at end of file diff --git "a/\351\231\210\345\237\271\346\235\260/2024.05.28-\350\277\207\346\273\244\345\231\250.md" "b/\351\231\210\345\237\271\346\235\260/2024.05.28-\350\277\207\346\273\244\345\231\250.md" new file mode 100644 index 0000000..7575e04 --- /dev/null +++ "b/\351\231\210\345\237\271\346\235\260/2024.05.28-\350\277\207\346\273\244\345\231\250.md" @@ -0,0 +1,48 @@ +#### 过滤器 +##### Filter的开发和调用 +``` + +在默认的WebApi中,框架提供了三种Filter,他们的功能和运行条件如下表所示: + +Filter 类型 实现的接口 描述 +Authorization IAuthorizationFilter 最先运行的Filter,被用作请求权限校验 +Action IActionFilter 在Action运行的前、后运行 +Exception IExceptionFilter 当异常发生的时候运行 +``` +``` +建Filter ApiResultFilter.cs: + +namespace Admin2024.Api; + +public class ApiResultFilter:IAsyncResultFilter{ + public Task OnResultExecutionAsync(ResultExecutingContent content,ResultExectionDeletegate next){ + //判断返回结果是否是内容,如果是,我们就给content.Result赋一个新的实例对象 + if(content.Result is objectResult){ + var objectResult=(objectResult)content.Result; + content.Result=new objectResult(new ApiResult{ + Code=1000, + Msg="请求成功", + Data=objectResult.Value + }) + }else{ + content.Result=new objectResult(new ApiResult{ + Code=1001 + }) + await next(); + } + } +} +``` + +``` +Dto ApiResult.cs + +namespace Admin2024.Api; + +public class ApiResult{ + public int Code{get;set;} + public string? Msg{get;set;} + public object? Data{get;set;} + +} +``` \ No newline at end of file diff --git "a/\351\231\210\345\237\271\346\235\260/20240520-NETCore\345\222\214ASP.NETCore.md" "b/\351\231\210\345\237\271\346\235\260/20240520-NETCore\345\222\214ASP.NETCore.md" index e69de29..7887da0 100644 --- "a/\351\231\210\345\237\271\346\235\260/20240520-NETCore\345\222\214ASP.NETCore.md" +++ "b/\351\231\210\345\237\271\346\235\260/20240520-NETCore\345\222\214ASP.NETCore.md" @@ -0,0 +1,65 @@ +#### NET Core简介 +``` +.NET Core是由微软开发的跨平台、开源的开发框架,适用于构建现代、高性能的应用程序 + +高性能:.NET Core被设计为高性能的,特别适用于需要高吞吐量和低延迟的应用,如微服务和云计算应用 +模块化:.NET Core采用模块化设计,开发者可以按需引入所需的库和功能,从而减小应用程序的大小并提高性能 + +统一编程模型:.NET Core提供了一个统一的编程模型,支持多种类型的应用程序,包括控制台应用、Web应用(通过ASP.NET Core)、桌面应用(通过Windows Forms和WPF)、微服务、云服务等 + +兼容性:.NET Core可以与其他.NET框架(如.NET Framework和Mono)兼容,并且提供了迁移工具,帮助开发者从旧版本迁移到.NET Core。 + +依赖注入:.NET Core内置依赖注入支持,简化了对象的创建和管理,提升了代码的可测试性和可维护性 另外一个最常用的.NET平台是.NETFramework,两者是不同的.NET平台,主要的区别是:前者跨平台,后者仅支持Windows +``` +#### NET Standard简介 +``` +.NET Standard是一个旨在提供一组统一API规范的标准,确保不同.NET实现(如 .NET Framework、.NET Core 和 Xamarin)之间的代码兼容性和共享性。具有以下特点: + +统一API规范 +代码共享:开发者可以编写能够在多个.NET平台上运行的库和组件,从而提高代码重用性 +版本管理:.NET Standard有多个版本,每个版本包含一组特定的API +跨平台支持 +``` +#### ASP.NET Core简介 +``` +ASP.NET Core是一个开源、跨平台的高性能Web框架,用于构建现代、云端优化的Web应用和服务。具有以下特点: + +跨平台 +开源 +高性能 +模块化和灵活性:采用模块化设计,开发者可以根据需要选择和配置中间件组件,构建高度定制化的请求处理管道- 统一的编程模型 +依赖注入:内置了依赖注入(DI)框架,简化了应用的配置和管理,提高了代码的可维护性和可测试性 +现代开发工具 +云优化 +兼容性和迁移 +``` +#### 创建第一个API项目 +``` +// 恢复项目中的NuGet包依赖项: +dotnet restore + +// 编译项目: +dotnet build + +// 运行项目: +dotnet run + +// 测试项目: +dotnet test + +// 发布项目: +dotnet publish -c Release -o +-c Release指定发布配置为Release模式,-o指定输出文件夹 + +// 添加包: +dotnet add package + +// 添加项目引用: +dotnet add reference + +// 移除引用: +dotnet remove + +// 清理项目: +dotnet clean +``` \ No newline at end of file diff --git "a/\351\231\210\345\237\271\346\235\260/20240521-\344\270\255\351\227\264\344\273\266.md" "b/\351\231\210\345\237\271\346\235\260/20240521-\344\270\255\351\227\264\344\273\266.md" index e69de29..af81d99 100644 --- "a/\351\231\210\345\237\271\346\235\260/20240521-\344\270\255\351\227\264\344\273\266.md" +++ "b/\351\231\210\345\237\271\346\235\260/20240521-\344\270\255\351\227\264\344\273\266.md" @@ -0,0 +1,56 @@ +### 一、解决方案和项目之间的关系 +1. 编译或打包解决方案时,会同时编译或打包其下所有项目 +2. 如果运行解决方案,会按编排的(指定的启动项目),分别编译该项目 +3. 在根目录下编译项目会一起编译解决方案,而在项目目录下编译却只会编译该项目 + +### 二、在项目中引用另一个项目 +~~~js +dotnet add.\MyApi\ reference .\ApiDemo\ +// 在MyApi项目中引用ApiDemo项目 +// 则在MyApi.csproj文件中会出现以下代码 + + + +~~~ + +### 三、添加依赖包 +~~~js +dotnet add .\MyApi\ package package_name +// 则在MyApi.csproj文件中会出现以下代码: + + +// 也可以根据MyApi.csproj文件还原包 +dotnet restore +~~~ + +### 四、编译一个简单的api请求 +1. 编译代码 +~~~js +// 在program.cs中 +// 使用了 MapGet 方法来指定了一个 GET 请求的路由路径为 "/api/users" +app.MapGet("/api/users",()=>{ + // 创建了一个 List 类型的列表对象,用于存储动态类型的元素 + var list = new List(); + list.Add(new{ + Id=1, + }); + list.Add(new{ + Id=2, + }); + return list; +}); +~~~ +### 五、中间件 +1. 添加中间件 +~~~js +// 接受 HttpContext 对象 ctx 和一个 next 委托作为参数 +app.Use(async (ctx,next)=>{ + // 创建变量forecast,其中存储包含1到10的整数序列 + // Enumerable.Range 方法用于生成指定范围内的整数序列 + var forecast = Enumerable.Range(1,10); + // 调用下一个中间件或终结点,使得控制权传递给下一个中间件或请求处理终结点 + await next(); + // 调用下一个中间件或终结点,使得控制权传递给下一个中间件或请求处理终结点 + ctx.Response.WriteAsync("C929星球"); +}); +~~~ \ No newline at end of file diff --git "a/\351\231\210\345\237\271\346\235\260/20240523-\344\276\235\350\265\226\346\263\250\345\205\245.md" "b/\351\231\210\345\237\271\346\235\260/20240523-\344\276\235\350\265\226\346\263\250\345\205\245.md" index e69de29..2f6ff12 100644 --- "a/\351\231\210\345\237\271\346\235\260/20240523-\344\276\235\350\265\226\346\263\250\345\205\245.md" +++ "b/\351\231\210\345\237\271\346\235\260/20240523-\344\276\235\350\265\226\346\263\250\345\205\245.md" @@ -0,0 +1,15 @@ +### 依赖注入 +依赖注入是一种新的设计模式,通过正确使用依赖注入的相关技术,可以降低系统耦合度,增加系统的可扩展性。 + +### 实例的生命周期 +.NET Core DI 为我们提供的实例生命周其包括三种: +- Transient: 每一次GetService都会创建一个新的实例 +- Scoped: 在同一个Scope内只初始化一个实例 ,可以理解为( 每一个 request级别只创建一个实例,同一个http request会在一个 scope内) +- Singleton :整个应用程序生命周期以内只创建一个实例 +### 方法 +- `Main` 方法:这是应用程序的入口点。它调用 `CreateHostBuilder(args).Build().Run()` 来初始化和启动 Web 主机。 +- `CreateHostBuilder` 方法:配置 Web 主机构建器。它使用 `WebHost.CreateDefaultBuilder(args)` 创建默认的构建器,该构建器加载配置(如 `appsettings.json`)并设置日志记录等。然后,它调用 `.UseStartup()` 来指定应用程序启动时使用的启动类。 +- `Startup` 类:定义了 ASP.NET Core 应用程序的启动逻辑。 +- `ConfigureServices` 方法:在服务容器中注册应用程序所需的服务和依赖项。`services.AddControllers();` 添加了 MVC 控制器服务,这是 ASP.NET Core MVC 框架的核心部分。 +- `Configure` 方法:配置应用程序的请求处理管道。`app.UseRouting()` 启用路由中间件,它是处理请求 URL 并将其与应用程序中的路由匹配的关键组件。`app.UseEndpoints(endpoints => { endpoints.MapControllers(); })` 设置终结点路由中间件,它负责将请求映射到 MVC 控制器。 +- `MapControllers` 方法:一个扩展方法,它告诉终结点路由中间件如何将请求映射到应用程序中的控制器。 \ No newline at end of file diff --git "a/\351\231\210\345\237\271\346\235\260/20240524-webapi\346\226\260\347\211\210.md" "b/\351\231\210\345\237\271\346\235\260/20240524-webapi\346\226\260\347\211\210.md" index e69de29..d2da3e1 100644 --- "a/\351\231\210\345\237\271\346\235\260/20240524-webapi\346\226\260\347\211\210.md" +++ "b/\351\231\210\345\237\271\346\235\260/20240524-webapi\346\226\260\347\211\210.md" @@ -0,0 +1,57 @@ +``` +Program.cs: +namespace Admin2024.Api; + +public static class Program{ + public static void Main(string[] args){ + CreateHostBuilder(args).Build().Run(); + } + + public static IHostBuilder CreateHostBuilder(string[] args){ + return Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(builder=>{ + builder.UseStartup(); + }); + } +} +``` + +``` +Startup.cs: +namespace Admin2024.Api; +public class Startup{ + public void ConfigureServices(IServiceCollection services){ + services.AddControllers(); + } + + public void Configure(IApplicationBuilder app){ + app.UseRouting(); + app.UseEndpoints(endpoints=>{ + endpoints.MapControllers(); + }); + } +} +``` + +``` +controller bookscontroller: +using Microsoft.AspNetCore.Mvc; + +namespace Admin2024.Api; + +[Route("[controller]")] + +public class BooksController:ControllerBase{ + public IActionResult Index(){ + return Ok("886"); + } +} +``` + +``` +Admin2024.Api.http: +@url=http://localhost:5000 + +### +GET {{url}}/books +Accept: application/json +``` \ No newline at end of file diff --git "a/\351\231\210\345\237\271\346\235\260/20240530_\351\241\271\347\233\256\350\256\276\350\256\241.md" "b/\351\231\210\345\237\271\346\235\260/20240530_\351\241\271\347\233\256\350\256\276\350\256\241.md" new file mode 100644 index 0000000..4f15f95 --- /dev/null +++ "b/\351\231\210\345\237\271\346\235\260/20240530_\351\241\271\347\233\256\350\256\276\350\256\241.md" @@ -0,0 +1,27 @@ +一、项目设计 +## 一、主体结构 +1. Resultfull风格的WebApi +2. Asp.net core 8.0 +3. 采用传统控制器模式 + +## 二、模型设计(例如:图书管理系统) +### 1.作者表Authors +1. 姓名 AuthorName +2. 性别 Gender +3. 出生年月 Birthday +### 2.图书表Books +1. 书名BookName +2. 出版社Publiser +3. 作者AuthorId +4. 价格Price + +## 三、内存型数据库(自定义的一个集合类) +在应用程序中定义一个类,专门提供模拟数据 + +## 四、仓储系统(准备用来接入数据库的一套接口) +### 1.通用型仓储接口 +定义了通用的数据存取操作方法,例如增删改查 +### 2.个性化的仓储接口 +针对特定业务需求而定义的数据存取接口,通常继承自通用型仓储接口,通过扩展通用接口来实现特定业务需求的操作 + +## 五、利用主体结构,具体实现Resultfull风格的关于两个表的CRUD \ No newline at end of file diff --git "a/\351\231\210\345\237\271\346\235\260/20240531-\345\233\276\344\271\246\351\246\206\347\256\241\347\220\206\347\263\273\347\273\237.md" "b/\351\231\210\345\237\271\346\235\260/20240531-\345\233\276\344\271\246\351\246\206\347\256\241\347\220\206\347\263\273\347\273\237.md" new file mode 100644 index 0000000..24a8d5d --- /dev/null +++ "b/\351\231\210\345\237\271\346\235\260/20240531-\345\233\276\344\271\246\351\246\206\347\256\241\347\220\206\347\263\273\347\273\237.md" @@ -0,0 +1,105 @@ +创建项目 + +打开集成终端,写入以下代码 + +创建项目 dotnet new webapi -o/-n 项目名称 cd 项目名称 +启动项目 dotnet run/dotnet watch --project .\项目名称\ +打开Program.cs + +// 定义一个名为TodoA的命名空间 +namespace TodoA +{ + // 定义一个公共静态类,用于应用程序的入口点 + public static class Program + { + // 主函数,应用程序的入口点,接收命令行参数 + public static void Main(string[] args) + { + // 创建一个HostBuilder实例,用于配置和构建应用程序 + IHostBuilder hostBuilder = CreateHostBuilder(args); + + // 使用Build方法构建和启动应用程序 + hostBuilder.Build().Run(); + } + + // 创建HostBuilder的静态方法,用于配置WebHost的默认设置 + public static IHostBuilder CreateHostBuilder(string[] args) + { + // 使用Host类的CreateDefaultBuilder方法创建一个新的Builder实例,传入命令行参数 + return Host.CreateDefaultBuilder(args); + + // 添加WebHost的默认配置,即使用Startup类作为应用程序的启动点 + .ConfigureWebHostDefaults(builder => + { + builder.UseStartup(); + }); + } + } +} +在同层创建一个Startup.cs文件,写入以下代码 + +// 定义一个名为TodoA的命名空间 +namespace TodoA + // 定义一个公共类,用于应用程序的启动和配置 + public class Startup + { + // 配置服务容器的方法,用于注册依赖注入的服务 + public void ConfigureServices(IServiceCollection services) + { + // 注册控制器服务 + services.AddControllers(); + } + + // 配置中间件管道的方法,用于设置HTTP请求处理的流程 + public void Configure(IApplicationBuilder app) + { + // 使用Routing中间件,用于路由匹配 + app.UseRouting(); + + // 使用Endpoints中间件,用于管理终结点 + app.UseEndpoints(endPoints => + { + // 将控制器终结点映射到应用程序中 + endPoints.MapControllers(); + }); + } + } +在Controller文件夹中添加BooksController.cs文件,写图书的信息,实现crud + +using Microsoft.AspNetCore.Mvc; // 引入ASP.NET Core MVC的命名空间,用于控制器和动作方法的创建 + +namespace TodoA; // 定义命名空间,用于组织代码 + +[ApiController] // 标记该类为API控制器,启用一些API控制器的特性 +[Route("/api/[controller]")] // 定义控制器的路由模板,[controller]将替换为控制器名称 + +public class BooksController : ControllerBase // 定义一个公共类BooksController,继承自ControllerBase +{ + // 查询操作,通过HTTP GET请求获取特定ID的书籍信息 + [HttpGet("{id}")] // 使用HTTP GET方法,并定义路径参数{id} + public IActionResult Get(int id, BooksDto booksDto) // 定义Get方法,接收一个整数id和一个BooksDto对象 + { + return Ok(new { id, booksDto }); // 返回包含id和booksDto的Ok结果 + } + + // 增加操作,通过HTTP POST请求添加新的书籍信息 + [HttpPost] // 使用HTTP POST方法 + public IActionResult Post(BooksDto booksDto) // 定义Post方法,接收一个BooksDto对象 + { + return Ok(new { booksDto }); // 返回包含booksDto的Ok结果 + } + + // 修改操作,通过HTTP PUT请求更新特定ID的书籍信息 + [HttpPut("{id}")] // 使用HTTP PUT方法,并定义路径参数{id} + public IActionResult Put(int id, BooksDto booksDto) // 定义Put方法,接收一个整数id和一个BooksDto对象 + { + return Ok(new { id, booksDto }); // 返回包含id和booksDto的Ok结果 + } + + // 删除操作,通过HTTP DELETE请求删除特定ID的书籍信息 + [HttpDelete("{id}")] // 使用HTTP DELETE方法,并定义路径参数{id} + public IActionResult Delete(int id, BooksDto booksDto) // 定义Delete方法,接收一个整数id和一个BooksDto对象 + { + return Ok(); // 返回一个简单的Ok结果,表示操作成功 + } +}; \ No newline at end of file -- Gitee From 3dcb5bd755f08eb5975b52f779dedca040951ec7 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 2 Jun 2024 19:08:03 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E7=AC=94=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20240527-\350\267\257\347\224\261.md" | 0 .../20240528-\350\277\207\346\273\244\345\231\250.md" | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename "\351\231\210\345\237\271\346\235\260/2024.05.27-\350\267\257\347\224\261.md" => "\351\231\210\345\237\271\346\235\260/20240527-\350\267\257\347\224\261.md" (100%) rename "\351\231\210\345\237\271\346\235\260/2024.05.28-\350\277\207\346\273\244\345\231\250.md" => "\351\231\210\345\237\271\346\235\260/20240528-\350\277\207\346\273\244\345\231\250.md" (100%) diff --git "a/\351\231\210\345\237\271\346\235\260/2024.05.27-\350\267\257\347\224\261.md" "b/\351\231\210\345\237\271\346\235\260/20240527-\350\267\257\347\224\261.md" similarity index 100% rename from "\351\231\210\345\237\271\346\235\260/2024.05.27-\350\267\257\347\224\261.md" rename to "\351\231\210\345\237\271\346\235\260/20240527-\350\267\257\347\224\261.md" diff --git "a/\351\231\210\345\237\271\346\235\260/2024.05.28-\350\277\207\346\273\244\345\231\250.md" "b/\351\231\210\345\237\271\346\235\260/20240528-\350\277\207\346\273\244\345\231\250.md" similarity index 100% rename from "\351\231\210\345\237\271\346\235\260/2024.05.28-\350\277\207\346\273\244\345\231\250.md" rename to "\351\231\210\345\237\271\346\235\260/20240528-\350\277\207\346\273\244\345\231\250.md" -- Gitee