From cde23b5022caeea4844b378393ece9ed5b4a38fc Mon Sep 17 00:00:00 2001 From: chenjunhao <2509288351@qq.com> Date: Sun, 26 May 2024 20:32:52 +0800 Subject: [PATCH] =?UTF-8?q?webapi=E7=AC=AC2=E6=AC=A1=E7=AC=94=E8=AE=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0240516-\345\210\235\345\247\213webapi.md" | 37 -------- ...0240520-NETCore\345\222\214ASP.NETCore.md" | 55 ++++++++++++ ...70\345\277\203\347\211\271\346\200\247.md" | 89 +++++++++++++++++++ ...35\350\265\226\346\263\250\345\205\245.md" | 70 +++++++++++++++ ...0240524-webapi\346\226\260\347\211\210.md" | 57 ++++++++++++ 5 files changed, 271 insertions(+), 37 deletions(-) delete mode 100644 "\347\254\224\350\256\260/20240516-\345\210\235\345\247\213webapi.md" create mode 100644 "\351\231\210\344\277\212\350\261\252/20240520-NETCore\345\222\214ASP.NETCore.md" create mode 100644 "\351\231\210\344\277\212\350\261\252/20240521-\346\240\270\345\277\203\347\211\271\346\200\247.md" create mode 100644 "\351\231\210\344\277\212\350\261\252/20240523-Startup\347\261\273\357\274\214\344\276\235\350\265\226\346\263\250\345\205\245.md" create mode 100644 "\351\231\210\344\277\212\350\261\252/20240524-webapi\346\226\260\347\211\210.md" diff --git "a/\347\254\224\350\256\260/20240516-\345\210\235\345\247\213webapi.md" "b/\347\254\224\350\256\260/20240516-\345\210\235\345\247\213webapi.md" deleted file mode 100644 index ac90c4e..0000000 --- "a/\347\254\224\350\256\260/20240516-\345\210\235\345\247\213webapi.md" +++ /dev/null @@ -1,37 +0,0 @@ - -## 常见的 Web API 类型 - -### RESTful API - -RESTful API 是一种基于 REST(Representational State Transfer)原则设计的 API。它使用 HTTP 协议的不同方法(GET、POST、PUT、DELETE 等)来执行不同的操作,例如获取数据、创建资源、更新资源或删除资源。RESTful API 使用简单的 URL 结构和状态码,易于理解和实现。 - -### GraphQL API - -GraphQL 是一种查询语言,允许客户端请求指定所需的数据。相比于传统的 RESTful API,GraphQL API 允许客户端精确地指定返回结果的格式和内容,避免了多次请求和返回冗余数据的问题。GraphQL API 的灵活性和效率使其在一些场景下更具优势。 - -## RESTful API 的特点 - -- **基于资源(Resource-based)**:在 RESTful API 中,每个 URL 代表一个资源(Resource),并且通过 HTTP 方法对资源进行操作。资源可以是实体对象(如用户、文章)或集合(如用户列表)。 - -- **使用 HTTP 方法**:RESTful API 使用 HTTP 方法来定义对资源的操作。常用的方法包括 GET(获取资源)、POST(创建资源)、PUT(更新资源)、DELETE(删除资源)等。 - -- **无状态(Stateless)**:RESTful API 是无状态的,每个请求都是独立的,服务器不会保存请求的上下文信息。客户端需要提供所有请求所需的数据和信息。 - -- **使用 JSON 或 XML 进行数据交换**:通常,RESTful API 使用 JSON 或 XML 格式来传输数据。JSON 更为常用,因为它具有更好的可读性和易用性。 - -## RESTful API 的设计原则 - -- 使用合适的 HTTP 方法对资源进行操作,如 GET、POST、PUT、DELETE。 -- 使用简洁明了的 URL 结构,使其易于理解和记忆。 -- 对资源的操作应该是幂等的,即无论执行多少次都不会对资源状态产生影响。 -- 返回合适的状态码(如 200、201、404、500)以表示请求的成功或失败。 - -## RESTful API 的示例 - -假设有一个博客系统,可以使用以下方式设计 RESTful API: - -- 获取所有文章:`GET /api/articles` -- 获取单篇文章:`GET /api/articles/:id` -- 创建文章:`POST /api/articles` -- 更新文章:`PUT /api/articles/:id` -- 删除文章:`DELETE /api/articles/:id` diff --git "a/\351\231\210\344\277\212\350\261\252/20240520-NETCore\345\222\214ASP.NETCore.md" "b/\351\231\210\344\277\212\350\261\252/20240520-NETCore\345\222\214ASP.NETCore.md" new file mode 100644 index 0000000..97680bc --- /dev/null +++ "b/\351\231\210\344\277\212\350\261\252/20240520-NETCore\345\222\214ASP.NETCore.md" @@ -0,0 +1,55 @@ +#### ASP.NET Core简介 + +ASP.NET Core是一个开源、跨平台的高性能Web框架,用于构建现代、云端优化的Web应用和服务。具有以下特点: +跨平台,开源,高性能。 +模块化和灵活性:采用模块化设计,开发者可以根据需要选择和配置中间件组件,构建高度定制化的请求处理管道- 统一的编程模型 +依赖注入:内置了依赖注入(DI)框架,简化了应用的配置和管理,提高了代码的可维护性和可测试性 +现代开发工具 +云优化 +兼容性和迁移 + + +#### 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 + + +#### 创建第一个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\344\277\212\350\261\252/20240521-\346\240\270\345\277\203\347\211\271\346\200\247.md" "b/\351\231\210\344\277\212\350\261\252/20240521-\346\240\270\345\277\203\347\211\271\346\200\247.md" new file mode 100644 index 0000000..ad9696b --- /dev/null +++ "b/\351\231\210\344\277\212\350\261\252/20240521-\346\240\270\345\277\203\347\211\271\346\200\247.md" @@ -0,0 +1,89 @@ +#### 创建一个Api项目 +``` +cd src +dotnet new sln -n Admin2024 +dotnet new webapi -n Admin2024.Api +dotnet new webapi -n Admin2024.Domain +``` +``` +解决方案和项目之间的联系: +1.编译或者打包解决方案的时候,会同时编译或者打包其下所有项目 +2.如果运行解决方案的话,则会按照编排的(指定的启动项目),分别调用指定项目 +``` + +``` +将Admin2024.api放入解决方案中(编译) +dotnet sln add .\Admin2024.Api +dotnet build +dotnet sln add .\Admin2024.Domain +dotnet build +添加依赖包:dotnet add package Microsoft +dotnet restore +``` + +#### 核心特性 +``` +Admin2024.Api: +app.MapGet("api/users",()=>{ + var list=new list(); + list Add(new { + Id=1, + username="admin", + nickname="超级管理员" + }); + list Add(new { + Id=2, + username="admin", + nickname="普通管理员" + }); +}) +return list; + +终端:dotnet run --project .\src\Admin2024.Api\ +``` + +##### 中间件 +``` +programs.cs: +app.usecasync(ctx,next=>{ + var forecast=Enumerable.Range(1,10); + ctx.Response.Writesync(forecast) + app.Run(); +}) + +终端:dotnet watch --project .\src\Admin2024.Api\ +``` + +``` +var builder = WebApplication.CreateBuilder(args); + +var app = builder.Build(); + +app.MapGet("/",async ctx => { + + await ctx.Response.WriteAsync("8888"); +}); + + +app.MapGet("/leaf",async ctx => { + + await ctx.Response.WriteAsync("9999"); +}); + +app.Run(); + +``` + +``` +api.http: +@url=http://localhost:5000 + +### +GET {{url}}/api/users HTTP/1.1 + +### +GET {{url}}/weatherforecast HTTP/1.1 + +### +GET {{URL}}/HTTP/1.1 +``` diff --git "a/\351\231\210\344\277\212\350\261\252/20240523-Startup\347\261\273\357\274\214\344\276\235\350\265\226\346\263\250\345\205\245.md" "b/\351\231\210\344\277\212\350\261\252/20240523-Startup\347\261\273\357\274\214\344\276\235\350\265\226\346\263\250\345\205\245.md" new file mode 100644 index 0000000..0097bd8 --- /dev/null +++ "b/\351\231\210\344\277\212\350\261\252/20240523-Startup\347\261\273\357\274\214\344\276\235\350\265\226\346\263\250\345\205\245.md" @@ -0,0 +1,70 @@ +#### Startup类 +IWebHostBuilder接口有多个扩展方法,其中有一个很重要的是UseStartup方法,他主要向应用程序提供用于配置启动的类,而指定的这个类应具有一下两个方法: +``` +ConfigureServices:用于向ASP.NET Core的依赖注入容器添加服务 +Configure:用于添加中间件,配置请求管理 +``` +``` +public class Startup{ + public void ConfigureServices(IServiceCollection services){ + ... + services.AddMvc(); + services.AddScoped + + } +} +``` + +#### 依赖注入 +``` +//startup.cs +public void ConfigureServices(IServiceCollection services) +{ + services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme) + .AddAzureADBearer(options => Configuration.Bind("AzureAd", options)); + + services.AddHttpContextAccessor(); + services.AddTransient(); + + //Register class for DI + services.UseCustomServices(); + + services.AddControllers(); + services.AddSwaggerGen(c => + { + c.SwaggerDoc("v1", new OpenApiInfo { Title = "RestfulApi", Version = "v1" }); + }); +} + +//webcommon注入扩展方法 +namespace RestfulApi.WebCommon +{ + public static class CustomServicesExtensions + { + public static IServiceCollection UseCustomServices(this IServiceCollection services) + { + var assembliesToScan = new[] { + Assembly.GetExecutingAssembly(), + Assembly.GetAssembly(typeof(MyNumberService)) + }; + + services.RegisterAssemblyPublicNonGenericClasses(assembliesToScan) + .Where(c => c.Name.EndsWith("Service")) + .AsPublicImplementedInterfaces(ServiceLifetime.Scoped); + + services.AddScoped(); + return services; + } + } +} +``` + +构造函数依赖注入分为三步: + +1、先创建一个接口 + +2、创建一个类,用于实现接口 + +3、到配置服务类(Startup)的 public void ConfigureServices(IServiceCollection services){ } 方法中注册,注册方式有 addSingleton() addTransient() addScoped() 三种 + +例如:services.AddSingleton<接口名 \ No newline at end of file diff --git "a/\351\231\210\344\277\212\350\261\252/20240524-webapi\346\226\260\347\211\210.md" "b/\351\231\210\344\277\212\350\261\252/20240524-webapi\346\226\260\347\211\210.md" new file mode 100644 index 0000000..d2da3e1 --- /dev/null +++ "b/\351\231\210\344\277\212\350\261\252/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 -- Gitee