diff --git "a/\346\270\270\346\265\267\346\236\227/2021-06-22-vue.md" "b/\346\270\270\346\265\267\346\236\227/2021-06-22-webapi.md" similarity index 100% rename from "\346\270\270\346\265\267\346\236\227/2021-06-22-vue.md" rename to "\346\270\270\346\265\267\346\236\227/2021-06-22-webapi.md" diff --git "a/\346\270\270\346\265\267\346\236\227/2021-06-23-webapi.md" "b/\346\270\270\346\265\267\346\236\227/2021-06-23-webapi.md" new file mode 100644 index 0000000000000000000000000000000000000000..528ecace1b794c774cdde4d262accd9d411827ea --- /dev/null +++ "b/\346\270\270\346\265\267\346\236\227/2021-06-23-webapi.md" @@ -0,0 +1,48 @@ +# 关于restfull的理解 + + +简单地来说REST它是一种使用URL来定位资源,使用HTTP请求描述操作的Web服务规范。REST主要包括以下几方面: + +1. REST是一组架构约束条件和原则,而满足这些约束条件和原则的应用程序就是RESTful。 +2. REST的目标是构建可扩展的Web Service,它是一种更简单的SOAP(Simple Object Access Protocol)协议以及以WSDL为基础的WebService的替代。 +3. REST采用的是HTTP协议并通过HTTP中的GET、POST、PUT、DELETE等动词收发数据。 +4. REST希望通过HTTP来完成对数据的元操作,即传统的CRUD(Create、Read、Update、Delete)分别对应GET、POST、PUT、DELETE,这样就统一了数据操作的接口,实现在不同平台上提供一套相同的服务。 +5. REST是一种面向服务的、分布式的API设计风格。 + +6. RESTful API的开发和使用,无非是客户端向服务器发请求(request),以及服务器对客户端请求的响应(response)。所以RESTful架构风格具有统一接口的特点,即:使用不同的http方法表达不同的行为: +``` +GET(SELECT):从服务器取出资源(一项或多项) +POST(CREATE):在服务器新建一个资源 +PUT(UPDATE):在服务器更新资源(客户端提供完整资源数据) +PATCH(UPDATE):在服务器更新资源(客户端提供需要修改的资源数据) +DELETE(DELETE):从服务器删除资源 +``` +## REST的约束条件和原则 + +REST本质上是Web服务的一种规范,一种思想。它主要包括以下特性: + +1. 资源(Resources) + +在REST中资源是整个架构或者说整个网络处理的核心,那么什么又是资源呢?在我们传统的观念中,资源是指服务器上的一个文件,而在REST里资源则是指一个URL。 + +URL即统一资源定位,而我们都知道通过URL可以访问互联网上的资源,所以在REST里这种对资源的指向性更加强烈,并且在这里资源的范畴会被无限放大而并非局限在 + +文件本身,例如以下实例: +``` + http://api.cnblogs.com/info/source 表示获取某人的成绩 + http://api.cnblogs.com/info/friends 表示获取某人的好友列表 + http://api.cnblogs.com/info/profile 表示获取某人的详细信息 + ``` +  由此我们注意到REST在形式上更加趋向API设计,而我们获取的资源则通过一定的形式进行统一而规范化的表达,因此REST实现了让不同的平台共享一套API这样的 + +愿望,这是一件非常美好的事情,这个世界上的技术阵营举不胜数,而它们为了各自的利益建立一套封闭、臃肿的体系框架,很多时候当我们不需要这样的“全家桶”并且 + +希望“跨平台”的时候,REST将会是一个不错的选择。 + +2. 表现形式(Representational) + +  在REST中表现形式作为我们对资源请求的一个结果的呈现,通过对HTTP协议的学习我们已经知道,服务器会给客户端返回什么形式的信息,这一点取决于服务器响应 + +报文中相关头部字段,而对REST来讲,它通常会采用XML或者JSON来告诉请求者请求的结果,因为JSON相比XML所含的冗余信息较少,所以目前更加倾向于或者说流行使 + +用JSON作为请求结果的表现形式。 \ No newline at end of file diff --git "a/\346\270\270\346\265\267\346\236\227/2021-06-26-webapi.md" "b/\346\270\270\346\265\267\346\236\227/2021-06-26-webapi.md" new file mode 100644 index 0000000000000000000000000000000000000000..dcce881837d4345199e7204f118b2e8795698d8e --- /dev/null +++ "b/\346\270\270\346\265\267\346\236\227/2021-06-26-webapi.md" @@ -0,0 +1,34 @@ +# ef core创建控制台应用 + +1. 创建一个webapi项目 + +2. 安装Entity Franmework Core + +``` +dotnet add package Microsoft.EntityFrameworkCore.Sqlserver +``` + +3. 创建一个模型 + +``` + public class BloggingContext : DbContext + { + public DbSet Blogs { get; set; } + public DbSet Posts { get; set; } + + // The following configures EF to create a Sqlite database file as `C:\blogging.db`. + // For Mac or Linux, change this to `/tmp/blogging.db` or any other absolute path. + protected override void OnConfiguring(DbContextOptionsBuilder options) + => options.UseSqlite(@"Data Source=C:\blogging.db"); + } +``` + +使用迁移创建数据库 + +``` +dotnet tool install --global dotnet-ef +dotnet add package Microsoft.EntityFrameworkCore.Design +dotnet ef migrations add InitialCreate +dotnet ef database update +这会安装 dotnet ef 和设计包,这是对项目运行命令所必需的。 migrations 命令为迁移搭建基架,以便为模型创建一组初始表。 database update 命令创建数据库并向其应用新的迁移。 +``` \ No newline at end of file diff --git "a/\346\270\270\346\265\267\346\236\227/2021-06-29-webapi.md" "b/\346\270\270\346\265\267\346\236\227/2021-06-29-webapi.md" new file mode 100644 index 0000000000000000000000000000000000000000..2cf5fb0e788602474a7c6610f302118fd8beb9ea --- /dev/null +++ "b/\346\270\270\346\265\267\346\236\227/2021-06-29-webapi.md" @@ -0,0 +1,24 @@ +# 关于Task类型的理解 + +### 异步返回类型 +异步方法可以具有以下返回类型: + ++ Task(对于执行操作但不返回任何值的异步方法)。 ++ Task(对于返回值的异步方法)。 ++ void(对于事件处理程序)。 ++ 从 C# 7.0 开始,任何具有可访问的 GetAwaiter 方法的类型。 GetAwaiter + 方法返回的对象必须实现 System.Runtime.CompilerServices.+ + + + CriticalNotifyCompletion 接口。 +从 C# 8.0 开始,IAsyncEnumerable 返回异步流的异步方法 。 +有关异步方法的详细信息,请参阅使用 Async 和 Await 的异步编程 (C#)。 + +还存在特定于 Windows 工作负载的其他几种类型: + ++ DispatcherOperation,适用于仅限于 Windows 的异步操作。 ++ IAsyncAction,适用于 UWP 中不返回值的异步操作。 ++ IAsyncActionWithProgress,适用于 UWP 中只报告进程但不返回值的异步操作。 ++ IAsyncOperation,适用于 UWP 中返回值的异步操作。 ++ IAsyncOperationWithProgress,适用于 UWP 中既报告进程又返回值的异步操作。 + + +### Task + +不包含 return 语句的异步方法或包含不返回操作数的 return 语句的异步方法通常具有返回类型 Task。 如果此类方法同步运行,它们将返回 void。 如果在异步方法中使用 Task 返回类型,调用方法可以使用 await 运算符暂停调用方的完成,直至被调用的异步方法结束。 \ No newline at end of file diff --git "a/\346\270\270\346\265\267\346\236\227/2021-06-30-webapi.md" "b/\346\270\270\346\265\267\346\236\227/2021-06-30-webapi.md" new file mode 100644 index 0000000000000000000000000000000000000000..13ed87d2ebbc0b29b3f61e5db9f1c8b89a3cc261 --- /dev/null +++ "b/\346\270\270\346\265\267\346\236\227/2021-06-30-webapi.md" @@ -0,0 +1,23 @@ +### AsQueryable() + ++ 将一个序列向下转换为一个IQueryable, 它生成了一个本地查询的IQueryable包装。 + +``` +var products = db.Product.where(p => p.Type == "food").select(p => new { p.Id, p.Name, p.CreateTime}); +``` + ++ Select() 的返回类型为 IQueryable,为 IQueryable, 语句执行后不会立刻查询数据库, 而是在迭代使用 products 时才会查数据库, 具有 lazy load 的特性, 按需查数据库可提高程序效率。 + + +### NullReferenceException() + ++ 如果对象是空的将会调用该方法。 + +### 关于Task返回值 + + ++ Task async await本来就是三位一体的缺少任何其中一个,那么是无法编译,要么就还是一个同步方法,实现不了异步功能 + ++ Task fun()就是一个同步方法,返回值是Task,而不是T + ++ async Task fun(){ await xxx } ,是异步的,返回的是T,而不是Task \ No newline at end of file diff --git "a/\346\270\270\346\265\267\346\236\227/2021-07-02-webapi.md" "b/\346\270\270\346\265\267\346\236\227/2021-07-02-webapi.md" new file mode 100644 index 0000000000000000000000000000000000000000..fdb4538055074d1a827b246258295fa3d10c1dbf --- /dev/null +++ "b/\346\270\270\346\265\267\346\236\227/2021-07-02-webapi.md" @@ -0,0 +1,55 @@ +### 依赖注入 + ++ 依赖,就是一个对象需要的另一个对象,比如说,这是我们通常定义的一个用来处理数据访问的存储 + + +https://www.cnblogs.com/mq0036/p/7473371.html + + + +### 进程和线程 + +1. 进程 + +进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用 + +程序运行的载体。进程是一种抽象的概念,从来没有统一的标准定义。进程一般由程序,数据集合和进程控制块三部分组成。程序用于描述 + +进程要完成的功能,是控制进程执行的指令集;数据集合是程序在执行时所需要的数据和工作区;程序控制块包含进程的描述信息和控制信息 + +是进程存在的唯一标志 + +进程具有的特征: + ++ 动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的; + ++ 并发性:任何进程都可以同其他进行一起并发执行; + ++ 独立性:进程是系统进行资源分配和调度的一个独立单位; + ++ 结构性:进程由程序,数据和进程控制块三部分组成 + + +2. 线程 + +线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或 + +多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。一个标准的线程由线程ID,当前指令指针PC,寄存器和堆栈组 + +成。而进程由内存空间(代码,数据,进程空间,打开的文件)和一个或多个线程组成。 + + + + 进程与线程的区别 + +1. 线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位; + +2. 一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线 + +3. 进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段,数据集,堆等)及一些进程级的资源(如打开文件和信 + +号等),某进程内的线程在其他进程不可见; + + + +https://www.cnblogs.com/qianqiannian/p/7010909.html \ No newline at end of file diff --git "a/\346\270\270\346\265\267\346\236\227/2021-07-03-webapi.md" "b/\346\270\270\346\265\267\346\236\227/2021-07-03-webapi.md" new file mode 100644 index 0000000000000000000000000000000000000000..0df51588578bd374a4080017f6bd4af8a6d45b60 --- /dev/null +++ "b/\346\270\270\346\265\267\346\236\227/2021-07-03-webapi.md" @@ -0,0 +1 @@ +![图片](./imgs/csharpbasic.png) \ No newline at end of file diff --git "a/\346\270\270\346\265\267\346\236\227/2021-07-06-webapi.md" "b/\346\270\270\346\265\267\346\236\227/2021-07-06-webapi.md" new file mode 100644 index 0000000000000000000000000000000000000000..48176c5077ce9cabf11c4d6cbb9deff513b08843 --- /dev/null +++ "b/\346\270\270\346\265\267\346\236\227/2021-07-06-webapi.md" @@ -0,0 +1,47 @@ +# JWT + +1. 首先创建一个webapi项目 + +2. 然后把项目添加到解决方案中 + +3. 安装JWT认证支持库 +``` +dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer +``` + + +4. 签发token + ++ 建立模型 + ++ 建立控制器 + ++ 在appsetting.json设置好参数 + +``` +"tokenParameter": { + "secret": "123456123456123456", + "issuer": "WangPlus", + "accessExpiration": 120, + "refreshExpiration": 1440 + } +``` + ++ 在model里创建一个映射类 + +``` +using System; + +namespace demo.Models +{ + public class tokenParameter + { + public string Secret { get; set; } + public string Issuer { get; set; } + public int AccessExpiration { get; set; } + public int RefreshExpiration { get; set; } + } +} +``` + ++ 在控制器里写相应的逻辑 \ No newline at end of file diff --git "a/\346\270\270\346\265\267\346\236\227/imgs/csharpbasic.png" "b/\346\270\270\346\265\267\346\236\227/imgs/csharpbasic.png" new file mode 100644 index 0000000000000000000000000000000000000000..b9aae4203a27edc850d7ff076c5882bd5c94bc87 Binary files /dev/null and "b/\346\270\270\346\265\267\346\236\227/imgs/csharpbasic.png" differ