From 3cd370aab7c0aa2d0eca9b2f70d459504511e578 Mon Sep 17 00:00:00 2001 From: zhao <123> Date: Mon, 20 May 2024 17:38:33 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E7=AC=94=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../0516.API\344\270\216REST.md" | 57 +++++++++++ "\350\265\265\346\254\243/0516.md" | 54 ----------- .../0520..NET Core CLI.md" | 96 +++++++++++++++++++ 3 files changed, 153 insertions(+), 54 deletions(-) create mode 100644 "\350\265\265\346\254\243/0516.API\344\270\216REST.md" delete mode 100644 "\350\265\265\346\254\243/0516.md" create mode 100644 "\350\265\265\346\254\243/0520..NET Core CLI.md" diff --git "a/\350\265\265\346\254\243/0516.API\344\270\216REST.md" "b/\350\265\265\346\254\243/0516.API\344\270\216REST.md" new file mode 100644 index 0000000..f878133 --- /dev/null +++ "b/\350\265\265\346\254\243/0516.API\344\270\216REST.md" @@ -0,0 +1,57 @@ +### API +Web API(Web Application Programming Interface)是一组定义了如何在网络上进行数据交换的规范。它允许不同的软件系统相互通信,通常是通过HTTP协议。 + +API的主要用途 +- 数据交换:允许不同的应用程序共享和交换数据。 +- 服务集成:集成第三方服务,如支付、地图、社交网络等。 +- 自动化:自动化任务,如数据同步、报告生成等。 + +创建一个api +``` +// 使用Fetch API调用RESTful API +fetch('https://api.example.com/data', { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer your_token' + } +}) +.then(response => response.json()) +.then(data => console.log(data)) +.catch(error => console.error('Error:', error)); +``` + +### REST +REST的作用是将我们上面提到的查看(view),创建(create),编辑(edit)和删除(delete)直接映射到HTTP 中已实现的GET,POST,PUT和DELETE方法。 + +这四种方法是比较常用的,HTTP总共包含八种方法: + +GET +POST +PUT +DELETE +OPTIONS +HEAD +TRACE +CONNECT +当我们在浏览器点点点的时候我们通常只用到了GET方法,当我们提交表单,例如注册用户的时候我们就用到了POST方法... + +介绍到这里,我们重新将上面的四个接口改写成REST风格: +``` +查看所有图书: + +GET http://demo.com/books +新增一本书: + +POST http://demo.com/books +Data: name=shuxue +修改一本书: + +PUT http://demo.com/books +Data:id=1,name=shuxue +删除一本书: + +DELETE http://demo.com/books +Data:id=1 +``` +这样改动之后API变得统一了,我们只需要改变请求方式就可以完成相关的操作,这样大大简化了我们接口的理解难度,变得易于调用。 \ No newline at end of file diff --git "a/\350\265\265\346\254\243/0516.md" "b/\350\265\265\346\254\243/0516.md" deleted file mode 100644 index 34940bb..0000000 --- "a/\350\265\265\346\254\243/0516.md" +++ /dev/null @@ -1,54 +0,0 @@ -* * * - -Web API 概念笔记 -============ - -1\. 定义 ------- - -Web API(Web Application Programming Interface)是一组定义了如何在网络上进行数据交换的规范。它允许不同的软件系统相互通信,通常是通过HTTP协议。 - -2\. 类型 ------- - -* **浏览器API**:内置于浏览器中,如DOM API、Canvas API等,用于增强网页功能和交互性。 -* **服务器API**:部署在服务器上,如RESTful API、SOAP API等,用于提供数据和服务给客户端。 - -3\. 关键特性 --------- - -* **无状态**:每个请求都是独立的,服务器不保存客户端状态。 -* **可缓存**:客户端可以缓存响应以提高性能。 -* **统一接口**:使用标准的HTTP方法(GET, POST, PUT, DELETE等)。 - -4\. 常见用途 --------- - -* **数据交换**:允许应用程序之间共享数据。 -* **服务集成**:集成第三方服务,如支付、地图、社交网络等。 -* **应用扩展**:通过API扩展应用功能,如插件、扩展等。 - -5\. 开发注意事项 ----------- - -* **安全性**:确保API的安全性,如使用OAuth、API密钥等。 -* **文档**:提供详细的API文档,包括请求和响应的示例。 -* **版本控制**:管理API的版本,确保向后兼容性。 - -6\. 示例代码 --------- - - // 使用Fetch API调用RESTful API - fetch('https://api.example.com/data', { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer your_token' - } - }) - .then(response => response.json()) - .then(data => console.log(data)) - .catch(error => console.error('Error:', error)); - - -* * * \ No newline at end of file diff --git "a/\350\265\265\346\254\243/0520..NET Core CLI.md" "b/\350\265\265\346\254\243/0520..NET Core CLI.md" new file mode 100644 index 0000000..43ac50b --- /dev/null +++ "b/\350\265\265\346\254\243/0520..NET Core CLI.md" @@ -0,0 +1,96 @@ +使用.NET Core CLI创建API项目 + +### 创建一个新的 Web API 项目 + +1. 打开命令行终端(如 PowerShell、CMD 或终端应用)。 + +2. 导航到想要创建项目的目录: + ``` + cd path\to\your\projects + ``` + +3. 使用以下命令创建一个新的 Web API 项目: + ``` + dotnet new webapi -n YourApiProjectName + ``` + 这将在当前目录下创建一个名为 "YourApiProjectName" 的新 Web API 项目。 + + - `-n` 参数用于指定项目的名称。将其替换为想要的项目名称。 + +4. 进入项目目录: + ``` + cd YourApiProjectName + ``` + +5. 使用文本编辑器(如 Visual Studio Code)打开项目文件夹中的 `Startup.cs` 文件。这个文件包含了应用程序的配置和启动代码。 + +6. 在 `ConfigureServices` 方法中,可以添加所需的服务。例如,注入数据库上下文、身份验证服务等。 + +7. 在 `Configure` 方法中,可以配置中间件管道。可以添加全局错误处理、路由规则、身份验证等。 + +### 运行项目 + +1. 返回到项目的根目录(如果已经在其中,可以跳过此步骤)。 + +2. 使用以下命令运行项目: + ``` + dotnet run + ``` + 这将启动 Web API 项目,并在本地计算机上的默认端口上运行该项目。 + +### 测试 API + +1. 打开浏览器或 API 调试工具。 + +2. 访问 `https://localhost:5001/weatherforecast`(默认情况下)以查看运行中的 Web API 项目返回的示例数据。 + + - 如果在运行项目时指定了不同的端口,应相应地更新访问的 URL。 + +3. 可以使用其他 API 测试工具(如 Postman 或 Swagger UI)来测试和调试自定义的 API 端点。 + + + +要在终端中使用.NET Core CLI同时创建两个API项目,可以按照以下步骤进行操作: + +1. 打开命令行终端(如 PowerShell、CMD 或终端应用)。 + +2. 导航到想要创建项目的目录: + ``` + cd path\to\your\projects + ``` + +3. 使用以下命令创建第一个API项目: + ``` + dotnet new webapi -n ApiProject1 + ``` + 这将在当前目录下创建一个名为 "ApiProject1" 的新 Web API 项目。 + +4. 使用以下命令创建第二个API项目: + ``` + dotnet new webapi -n ApiProject2 + ``` + 这将在当前目录下创建一个名为 "ApiProject2" 的新 Web API 项目。 + +5. 进入第一个项目的目录: + ``` + cd ApiProject1 + ``` + +6. 使用以下命令运行第一个项目: + ``` + dotnet run + ``` + 这将启动第一个 Web API 项目,并在本地计算机上的默认端口上运行该项目。 + +7. 打开另一个终端窗口,导航到第二个项目的目录: + ``` + cd path\to\your\projects\ApiProject2 + ``` + +8. 使用以下命令运行第二个项目: + ``` + dotnet run + ``` + 这将启动第二个 Web API 项目,并在本地计算机上的默认端口上运行该项目。 + +现在,已经在终端中使用.NET Core CLI同时创建并运行了两个API项目。可以根据需要进一步配置和开发这些项目。请注意,由于两个项目在不同的终端窗口中运行,它们会使用不同的端口,默认情况下是5000和5001。 \ No newline at end of file -- Gitee From 04afaba93f2c18f038b923285550dd7c4f3a98d9 Mon Sep 17 00:00:00 2001 From: zhao <123> Date: Tue, 21 May 2024 11:31:35 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E7=AC=94=E8=AE=B0and=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...00\345\240\206\345\221\275\344\273\244.md" | 255 ++++++++++++++++++ 1 file changed, 255 insertions(+) create mode 100644 "\350\265\265\346\254\243/0521\344\270\255\351\227\264\344\273\266\344\273\245\345\217\212\344\270\200\345\240\206\345\221\275\344\273\244.md" diff --git "a/\350\265\265\346\254\243/0521\344\270\255\351\227\264\344\273\266\344\273\245\345\217\212\344\270\200\345\240\206\345\221\275\344\273\244.md" "b/\350\265\265\346\254\243/0521\344\270\255\351\227\264\344\273\266\344\273\245\345\217\212\344\270\200\345\240\206\345\221\275\344\273\244.md" new file mode 100644 index 0000000..4a28734 --- /dev/null +++ "b/\350\265\265\346\254\243/0521\344\270\255\351\227\264\344\273\266\344\273\245\345\217\212\344\270\200\345\240\206\345\221\275\344\273\244.md" @@ -0,0 +1,255 @@ + +## 怎样实现一个解决方案中包含两个项目 +```c# +终端: +dotnet new sln -n 解决方案名称 +dotnet new webapi -n 项目名称1 +dotnet new webapi -n 项目名称2 +dotnet sln add 项目名称1 +dotnet sln add 项目名称2 +``` + +```c# +dotnet new classlib -n 类库名称 + +dotnet build 编译项目 + +dotnet run 运行项目 + +dotnet add 项目1 reference 项目2 --添加引用 + +dotnet add 项目名称 package 依赖包名 --添加依赖包 + +dotnet restore --还原项目 + +dotnet watch --project 项目名称 ---监听项目 + +dotnet clean --清理项目缓存 + +dotnet new webapi -n 项目名称 --创建项目 + +dotnet run --project 路径 --运行项目 + +dotnet new mvc -n 项目名称 --创建项目 +``` + +### 解决方案和项目之间的联系: +1.编译或者打包解决方案时,会同时编译或打包其下所有项目 +2.如果运行解决方案,则会按照编排的(指定的启动项目),分别调用指定的项目 + +```c# +var builder = WebApplication.CreateBuilder(args); + +var app = builder.Build(); + +app.MapGet("/", async ctx => { + await ctx.Response.WriteAsync("Hello World!"); +}); + +app.MapGet("/six", async ctx => { + await ctx.Response.WriteAsync("666"); +}); + +app.Run(); +``` +## 在最简形式下,转换为在单独的文件中写路径(抽离): +```c# +首先,创建一个名为Routes的文件夹,然后在其中创建一个名为AppRoutes.cs的新文件,在AppRoutes.cs中,定义一个类和静态方法来注册路由: + +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Http; + +public static class AppRoutes +{ + public static void ConfigureRoutes(IApplicationBuilder app) + { + app.MapGet("/", async ctx => + { + await ctx.Response.WriteAsync("Hello World!"); + }); + + app.MapGet("/six", async ctx => + { + await ctx.Response.WriteAsync("666"); + }); + } +} + +接下来,在Program.cs中,导入AppRoutes类并调用其ConfigureRoutes方法: + +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; +using Microsoft.AspNetCore.Builder; + +namespace YourNamespace +{ + public class Program + { + public static void Main(string[] args) + { + CreateHostBuilder(args).Build().Run(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => + { + webBuilder.UseStartup(); + }); + } +} + +然后创建一个名为Startup.cs的新文件,并定义Configure方法来调用AppRoutes.ConfigureRoutes: + +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + +namespace YourNamespace +{ + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + // 如果需要添加服务,可以在这里配置 + } + + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + { + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + + AppRoutes.ConfigureRoutes(app); // 使用AppRoutes类注册路由 + } + } +} + +现在,路由逻辑已经被抽离到AppRoutes.cs文件中,使得Program.cs和Startup.cs文件更加清晰。当需要添加或修改路由时,只需要在AppRoutes类中进行操作即可。 +``` + +## 那在最简形式下,怎样转换为传统的控制器模式呢: +```c# +第一步,创建控制器类 + +在项目中创建一个新的文件夹命名为Controllers.然后,在此文件夹下创建一个名为HomeController.cs的文件,浙江作为处理根路径请求的控制器 + +HomeController.cs: + +using Microsoft.AspNetCore.Mvc; + +namespace YourNamespace.Controllers +{ + [ApiController] + [Route("[controller]")] + public class HomeController : ControllerBase + { + [HttpGet] + public IActionResult Get() + { + return Ok("Hello World!"); + } + } +} + +第二步,创建额外的控制器和动作方法: + +对于/six的路由,可以选择在HomeController中添加另一个动作方法,或者创建一个新的控制器。以下是在HomeController中添加另一个动作方法的示例: + +修改后的HomeController.cs: + +using Microsoft.AspNetCore.Mvc; + +namespace YourNamespace.Controllers +{ + [ApiController] + [Route("[controller]")] + public class HomeController : ControllerBase + { + [HttpGet] + public IActionResult Get() + { + return Ok("Hello World!"); + } + + [HttpGet("six")] + public IActionResult GetSix() + { + return Ok("666"); + } + } +} + +第三步,配置Startup.cs + +确保在Startup.cs中启用MVC服务并配置路由 + +Startup.cs: + +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + +namespace YourNamespace +{ + public class Startup + { + public void ConfigureServices(IServiceCollection services) + { + services.AddControllers(); // 添加控制器服务 + } + + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + { + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + + app.UseRouting(); + + app.UseEndpoints(endpoints => + { + endpoints.MapControllers(); // 映射控制器 + }); + } + } +} + +现在,已经将原始的路由转换为传统的ASP.NET Core MVC路由。 +/路径由HomeController处理,而/six路径由GetSix方法处理。 +``` + + +## 中间件: + +在ASP.NET Core中,中间件(Middleware)是一个关键概念,它构成了处理HTTP请求和响应的核心组件。中间件按照定义的顺序形成一个请求处理管道,每个中间件组件负责执行特定的任务,如日志记录、身份验证、响应压缩等,然后可以选择将请求传递给下一个中间件,或者在某些情况下,直接返回响应结束请求处理。 + +中间件的主要特点和作用包括: + +串联处理: + +中间件通过Use方法串联起来,形成一个请求处理的链式结构。每个中间件都有机会处理请求,然后决定是否将请求传递给下一个中间件。 +责任分离: + +中间件允许将应用程序的不同功能分解成独立的模块,这样可以更好地维护和扩展代码。 +灵活性: + +可以根据需要轻松插入、移除或调整中间件的顺序,以改变请求处理流程。 +控制流: + +每个中间件通过调用next()或await next()来将控制权传递给下一个中间件。如果中间件不调用next(),则请求处理链会被“短路”,后面的中间件不会执行。 +性能优化: + +中间件设计得轻量级,因此对性能影响较小,可以高效地处理大量请求。 +组合性: + +可以创建自己的中间件组件,也可以使用官方提供的中间件库,如UseExceptionHandler用于处理未捕获的异常,UseStaticFiles用于服务静态文件等。 +可测试性: + +中间件通常设计为无状态的,这使得它们更容易被单元测试和集成测试。 +中间件是ASP.NET Core框架的核心组成部分,它允许开发者以灵活和模块化的方式构建高度定制化的Web应用程序。 \ No newline at end of file -- Gitee From 000f79336737f55e08c0b21cbf49f514136a0846 Mon Sep 17 00:00:00 2001 From: zhao <123> Date: Fri, 24 May 2024 11:43:10 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E7=AC=94=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...35\350\265\226\346\263\250\345\205\245.md" | 81 ++++++++++++++ ...35\350\265\226\346\263\250\345\205\245.md" | 101 ++++++++++++++++++ 2 files changed, 182 insertions(+) create mode 100644 "\350\265\265\346\254\243/0523.\344\276\235\350\265\226\346\263\250\345\205\245.md" create mode 100644 "\350\265\265\346\254\243/0524.\345\207\275\346\225\260\344\276\235\350\265\226\346\263\250\345\205\245.md" diff --git "a/\350\265\265\346\254\243/0523.\344\276\235\350\265\226\346\263\250\345\205\245.md" "b/\350\265\265\346\254\243/0523.\344\276\235\350\265\226\346\263\250\345\205\245.md" new file mode 100644 index 0000000..0859ddd --- /dev/null +++ "b/\350\265\265\346\254\243/0523.\344\276\235\350\265\226\346\263\250\345\205\245.md" @@ -0,0 +1,81 @@ +### 什么是依赖注入? + +依赖注入是一种设计模式,用于管理类之间的依赖关系。它通过在类的构造函数、属性或方法中动态提供依赖项的实例来实现。 + +### ASP.NET Core 中的依赖注入 + +ASP.NET Core 通过内置的依赖注入容器来管理应用程序中的服务依赖关系。可以在应用程序启动时配置依赖注入容器,并在整个应用程序中访问注册的服务。 + +### 注册服务 + +可以在应用程序启动时通过 `ConfigureServices` 方法注册服务到依赖注入容器中。 + +```csharp +public void ConfigureServices(IServiceCollection services) +{ + services.AddScoped(); +} +``` + +上面的代码中,`AddScoped` 方法用于注册一个服务。在这个例子中,我们注册了一个名为 `IMyService` 的服务,并指定它的实现类是 `MyService`。`AddScoped` 方法将 `IMyService` 注册为 Scoped 生命周期,表示每个请求将获得一个新的 `MyService` 实例。 + + +## 依赖注入 +```c# +Program.cs: + +namespace webwork1; +public static class Program +{ + public static void Main(string[] args) + { + CreateWebHostBuilder(args).Build().Run(); + } + public static IHostBuilder CreateWebHostBuilder(string[] args) + { + return Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(builder=>{ + builder.UseStartup(); + }); + } +} +``` + +```c# +Startup.cs: + +namespace webwork1; + +public class Startup +{ + public void Configure(IApplicationBuilder app) + { + app.UseRouting(); + + app.UseEndpoints(endPoint=>{ + endPoint.MapControllers(); + }); + } + + public void ConfigureServices(IServiceCollection services) + { + services.AddControllers(); + } +} +``` + +```c# +BlogController.cs: + +using Microsoft.AspNetCore.Mvc; +namespace webwork1; + +[Route("[controller]")] + +public class BlogsController:ControllerBase +{ + public IActionResult Index() + { + return Ok("Hello,World!"); + } +} +``` \ No newline at end of file diff --git "a/\350\265\265\346\254\243/0524.\345\207\275\346\225\260\344\276\235\350\265\226\346\263\250\345\205\245.md" "b/\350\265\265\346\254\243/0524.\345\207\275\346\225\260\344\276\235\350\265\226\346\263\250\345\205\245.md" new file mode 100644 index 0000000..ec34277 --- /dev/null +++ "b/\350\265\265\346\254\243/0524.\345\207\275\346\225\260\344\276\235\350\265\226\346\263\250\345\205\245.md" @@ -0,0 +1,101 @@ +## 依赖注入 +```c# +Program.cs: + +namespace webwork1 +{ + /// + /// 主程序类,用于启动ASP.NET Core Web应用程序。 + /// + public class Program + { + /// + /// 应用程序的入口点。 + /// + /// 命令行参数。 + public static void Main(string[] args) + { + // 创建Web主机构建器并配置应用程序启动 + CreateWebHostBuilder(args).Build().Run(); + } + + /// + /// 配置Web主机构建器。 + /// + /// 命令行参数。 + /// 配置好的Web主机构建器实例。 + public static IHostBuilder CreateWebHostBuilder(string[] args) + { + // 使用默认配置创建主机构建器,并配置Web主机的默认设置 + return Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(builder => + { + // 指定应用程序的启动类型 + builder.UseStartup(); + }); + } + } +} +``` + +```c# +Startup.cs: + +namespace webwork1 +{ + /// + /// 代表应用的启动类,用于配置应用的服务和中间件。 + /// + public class Startup + { + /// + /// 配置应用的中间件。 + /// + /// IApplicationBuilder实例,用于配置应用的请求处理管道。 + public void Configure(IApplicationBuilder app) + { + // 使用Routing中间件来启用路由。 + app.UseRouting(); + + // 使用Endpoints中间件来映射控制器路由。 + app.UseEndpoints(endPoint => + { + endPoint.MapControllers(); + }); + } + + /// + /// 配置应用的服务。 + /// + /// IServiceCollection实例,用于注册应用的服务。 + public void ConfigureServices(IServiceCollection services) + { + // 添加Controllers服务。 + services.AddControllers(); + } + } +} +``` + +```c# +BlogController.cs: + +using Microsoft.AspNetCore.Mvc; +namespace webwork1; + +// BlogsController 类定义了一个处理博客相关请求的控制器 +[Route("[controller]")] +public class BlogsController: ControllerBase +{ + /** + * 提供博客列表的索引页面。 + * + * 参数: 无 + * 返回值: IActionResult 类型,代表一个动作的结果,这里返回一个字符串内容。 + */ + public IActionResult Index() + { + // 返回一个字符串消息 + return Ok("你好,我有一个帽衫,啦啦啦"); + } +} +``` \ No newline at end of file -- Gitee