From b57422a69f0f88f78ea167d5d0fac9e3140f86b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=80=A1=E7=A6=8F?= <2210228593@qq.com> Date: Sun, 19 May 2024 13:13:12 +0000 Subject: [PATCH 1/5] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20=E6=9D=8E=E5=80=A1?= =?UTF-8?q?=E7=A6=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "\346\235\216\345\200\241\347\246\217/.keep" | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "\346\235\216\345\200\241\347\246\217/.keep" diff --git "a/\346\235\216\345\200\241\347\246\217/.keep" "b/\346\235\216\345\200\241\347\246\217/.keep" new file mode 100644 index 0000000..e69de29 -- Gitee From 24fea1ac32639a74fefec6c56171c664fd755a00 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 19 May 2024 23:16:18 +0800 Subject: [PATCH 2/5] bj --- "\346\235\216\345\200\241\347\246\217/.keep" | 0 .../20240515.md" | 60 +++++++++++++++++++ .../20240517.md" | 34 +++++++++++ 3 files changed, 94 insertions(+) delete mode 100644 "\346\235\216\345\200\241\347\246\217/.keep" create mode 100644 "\346\235\216\345\200\241\347\246\217/20240515.md" create mode 100644 "\346\235\216\345\200\241\347\246\217/20240517.md" diff --git "a/\346\235\216\345\200\241\347\246\217/.keep" "b/\346\235\216\345\200\241\347\246\217/.keep" deleted file mode 100644 index e69de29..0000000 diff --git "a/\346\235\216\345\200\241\347\246\217/20240515.md" "b/\346\235\216\345\200\241\347\246\217/20240515.md" new file mode 100644 index 0000000..a4f57b9 --- /dev/null +++ "b/\346\235\216\345\200\241\347\246\217/20240515.md" @@ -0,0 +1,60 @@ +使用Fetch API可以方便地进行RESTful API的调用。 +```javascript +// 发起GET请求获取所有项 +fetch('http://your-api-url/items') + .then(response => response.json()) + .then(data => { + console.log(data); // 处理返回的数据 + }) + .catch(error => { + console.error('Error:', error); // 处理错误 + }); + +// 发起POST请求创建新项 +const newItem = { name: 'New Item' }; +fetch('http://your-api-url/items', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(newItem) +}) + .then(response => response.json()) + .then(data => { + console.log(data); // 处理返回的数据 + }) + .catch(error => { + console.error('Error:', error); // 处理错误 + }); + +// 发起PUT请求更新特定项 +const itemId = 1; +const updatedItem = { name: 'Updated Item' }; +fetch(`http://your-api-url/items/${itemId}`, { + method: 'PUT', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(updatedItem) +}) + .then(response => response.json()) + .then(data => { + console.log(data); // 处理返回的数据 + }) + .catch(error => { + console.error('Error:', error); // 处理错误 + }); + +// 发起DELETE请求删除特定项 +const itemId = 1; +fetch(`http://your-api-url/items/${itemId}`, { + method: 'DELETE' +}) + .then(response => response.json()) + .then(data => { + console.log(data); // 处理返回的数据 + }) + .catch(error => { + console.error('Error:', error); // 处理错误 + }); +``` \ No newline at end of file diff --git "a/\346\235\216\345\200\241\347\246\217/20240517.md" "b/\346\235\216\345\200\241\347\246\217/20240517.md" new file mode 100644 index 0000000..e3652af --- /dev/null +++ "b/\346\235\216\345\200\241\347\246\217/20240517.md" @@ -0,0 +1,34 @@ +### API与REST + +API(Application Programming Interface,应用程序编程接口)是一组定义了软件组件如何相互交互的规范。它允许不同的软件系统之间进行通信,以实现特定的功能或服务。 + +REST(Representational State Transfer,表述性状态转移)是一种软件架构风格,用于设计网络应用程序。它基于HTTP协议,通过定义资源的标识符(URI)和对资源的操作(HTTP方法),实现了客户端和服务器之间的通信。RESTful API遵循REST原则,提供了一种灵活、可扩展且易于理解的方式来构建和设计API。 + +### HTTP协议 + +HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种用于传输超媒体文档(如HTML)的应用层协议。它是互联网上数据交换的基础,通常用于在Web浏览器和服务器之间传输网页和资源。HTTP基于客户端-服务器模型,客户端发送HTTP请求,服务器返回HTTP响应。 + +HTTP请求由请求方法、请求URI、协议版本、请求头部和请求体组成。常用的HTTP请求方法包括GET(获取资源)、POST(提交数据)、PUT(更新资源)、DELETE(删除资源)等。 + +HTTP响应由状态码、响应头部和响应体组成。状态码指示了请求的处理结果,常见的状态码包括200(成功)、404(未找到资源)、500(服务器内部错误)等。 + +### REST约束 + +REST架构风格包括一系列的约束条件,以确保系统的可伸缩性、简单性和可移植性。其中一些重要的REST约束包括: + +1. **客户端-服务器架构**:客户端和服务器分离,使得客户端和服务器可以独立地演化和扩展。 +2. **无状态性**:每个请求都包含了足够的信息,使得服务器可以理解并处理请求,而不需要依赖于之前的请求或会话状态。 +3. **缓存**:服务器可以对响应进行标记,以便客户端可以缓存响应并重复利用它们,从而提高性能。 +4. **统一接口**:通过统一的接口(例如URI、资源操作、媒体类型)来简化系统架构,并使得不同的组件可以独立演化。 +5. **分层系统**:通过层次化架构,使得客户端不需要了解整个系统的结构,只需与其交互的接口。 + +### 对REST的错误理解 + +1. **REST是一种协议**:实际上,REST是一种架构风格而不是协议。它基于HTTP协议,但并不限制于HTTP。虽然大多数RESTful API都使用HTTP作为通信协议,但它们也可以在其他协议上运行,如WebSocket。 + +2. **每个HTTP接口都是RESTful的**:即使一个API使用HTTP,并且使用了一些RESTful的理念,但并不意味着它就是真正的RESTful API。RESTful API需要遵循一系列约束条件,如无状态、统一接口等,而不仅仅是使用HTTP协议。 + +3. **URI中的动词表示操作**:RESTful API中,URI应该表示资源而不是操作。操作应该由HTTP方法来表示,例如GET用于获取资源,POST用于创建资源,PUT用于更新资源,DELETE用于删除资源。 + +4. **RESTful API需要使用所有的REST约束**:虽然RESTful API应该尽可能地遵循REST约束,但并不是所有的约束都适用于所有的情况。有时候根据实际情况做出权衡是可以接受的,例如在需要保持会话状态的应用中,无状态性约束可能无法完全实现。 +\ No newline at end of file \ No newline at end of file -- Gitee From 4679954135064b76e99187c395c2faa79ecd4304 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=80=A1=E7=A6=8F?= <2210228593@qq.com> Date: Sun, 19 May 2024 15:19:09 +0000 Subject: [PATCH 3/5] =?UTF-8?q?=E9=87=8D=E5=91=BD=E5=90=8D=20=E6=9D=8E?= =?UTF-8?q?=E5=80=A1=E7=A6=8F/20240515.md=20=E4=B8=BA=20=E6=9D=8E=E5=80=A1?= =?UTF-8?q?=E7=A6=8F/20240515--=E8=AE=A4=E8=AF=86webapi.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20240515--\350\256\244\350\257\206webapi.md" | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "\346\235\216\345\200\241\347\246\217/20240515.md" => "\346\235\216\345\200\241\347\246\217/20240515--\350\256\244\350\257\206webapi.md" (100%) diff --git "a/\346\235\216\345\200\241\347\246\217/20240515.md" "b/\346\235\216\345\200\241\347\246\217/20240515--\350\256\244\350\257\206webapi.md" similarity index 100% rename from "\346\235\216\345\200\241\347\246\217/20240515.md" rename to "\346\235\216\345\200\241\347\246\217/20240515--\350\256\244\350\257\206webapi.md" -- Gitee From a26260d5b77881a12089db2ca195b5c22ca8491d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=80=A1=E7=A6=8F?= <2210228593@qq.com> Date: Sun, 19 May 2024 15:19:58 +0000 Subject: [PATCH 4/5] =?UTF-8?q?=E9=87=8D=E5=91=BD=E5=90=8D=20=E6=9D=8E?= =?UTF-8?q?=E5=80=A1=E7=A6=8F/20240517.md=20=E4=B8=BA=20=E6=9D=8E=E5=80=A1?= =?UTF-8?q?=E7=A6=8F/20240517--rest.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20240517--rest.md" | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "\346\235\216\345\200\241\347\246\217/20240517.md" => "\346\235\216\345\200\241\347\246\217/20240517--rest.md" (100%) diff --git "a/\346\235\216\345\200\241\347\246\217/20240517.md" "b/\346\235\216\345\200\241\347\246\217/20240517--rest.md" similarity index 100% rename from "\346\235\216\345\200\241\347\246\217/20240517.md" rename to "\346\235\216\345\200\241\347\246\217/20240517--rest.md" -- Gitee From 02e37990da4091e68980f5c728aa1c606a837b95 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 26 May 2024 22:40:40 +0800 Subject: [PATCH 5/5] bj --- ...0240516-\345\210\235\345\247\213webapi.md" | 37 ++++++++++++ .../20240517--rest.md" | 34 ----------- ...345\273\272\351\246\226\344\270\252Api.md" | 25 ++++++++ ...73\345\212\240\351\241\271\347\233\256.md" | 18 ++++++ ...35\350\265\226\346\263\250\345\205\245.md" | 59 +++++++++++++++++++ ...72\346\216\247\345\210\266\345\231\250.md" | 58 ++++++++++++++++++ 6 files changed, 197 insertions(+), 34 deletions(-) create mode 100644 "\346\235\216\345\200\241\347\246\217/20240516-\345\210\235\345\247\213webapi.md" delete mode 100644 "\346\235\216\345\200\241\347\246\217/20240517--rest.md" create mode 100644 "\346\235\216\345\200\241\347\246\217/20240520-\345\210\233\345\273\272\351\246\226\344\270\252Api.md" create mode 100644 "\346\235\216\345\200\241\347\246\217/20240521-\350\247\243\345\206\263\346\226\271\346\241\210\357\274\214\345\274\225\347\224\250\346\267\273\345\212\240\351\241\271\347\233\256.md" create mode 100644 "\346\235\216\345\200\241\347\246\217/20240523-api\346\212\275\347\246\273\343\200\201\350\275\254\346\215\242\343\200\201\344\276\235\350\265\226\346\263\250\345\205\245.md" create mode 100644 "\346\235\216\345\200\241\347\246\217/20240524-api\345\210\233\345\273\272\346\216\247\345\210\266\345\231\250.md" diff --git "a/\346\235\216\345\200\241\347\246\217/20240516-\345\210\235\345\247\213webapi.md" "b/\346\235\216\345\200\241\347\246\217/20240516-\345\210\235\345\247\213webapi.md" new file mode 100644 index 0000000..ac90c4e --- /dev/null +++ "b/\346\235\216\345\200\241\347\246\217/20240516-\345\210\235\345\247\213webapi.md" @@ -0,0 +1,37 @@ + +## 常见的 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/\346\235\216\345\200\241\347\246\217/20240517--rest.md" "b/\346\235\216\345\200\241\347\246\217/20240517--rest.md" deleted file mode 100644 index e3652af..0000000 --- "a/\346\235\216\345\200\241\347\246\217/20240517--rest.md" +++ /dev/null @@ -1,34 +0,0 @@ -### API与REST - -API(Application Programming Interface,应用程序编程接口)是一组定义了软件组件如何相互交互的规范。它允许不同的软件系统之间进行通信,以实现特定的功能或服务。 - -REST(Representational State Transfer,表述性状态转移)是一种软件架构风格,用于设计网络应用程序。它基于HTTP协议,通过定义资源的标识符(URI)和对资源的操作(HTTP方法),实现了客户端和服务器之间的通信。RESTful API遵循REST原则,提供了一种灵活、可扩展且易于理解的方式来构建和设计API。 - -### HTTP协议 - -HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种用于传输超媒体文档(如HTML)的应用层协议。它是互联网上数据交换的基础,通常用于在Web浏览器和服务器之间传输网页和资源。HTTP基于客户端-服务器模型,客户端发送HTTP请求,服务器返回HTTP响应。 - -HTTP请求由请求方法、请求URI、协议版本、请求头部和请求体组成。常用的HTTP请求方法包括GET(获取资源)、POST(提交数据)、PUT(更新资源)、DELETE(删除资源)等。 - -HTTP响应由状态码、响应头部和响应体组成。状态码指示了请求的处理结果,常见的状态码包括200(成功)、404(未找到资源)、500(服务器内部错误)等。 - -### REST约束 - -REST架构风格包括一系列的约束条件,以确保系统的可伸缩性、简单性和可移植性。其中一些重要的REST约束包括: - -1. **客户端-服务器架构**:客户端和服务器分离,使得客户端和服务器可以独立地演化和扩展。 -2. **无状态性**:每个请求都包含了足够的信息,使得服务器可以理解并处理请求,而不需要依赖于之前的请求或会话状态。 -3. **缓存**:服务器可以对响应进行标记,以便客户端可以缓存响应并重复利用它们,从而提高性能。 -4. **统一接口**:通过统一的接口(例如URI、资源操作、媒体类型)来简化系统架构,并使得不同的组件可以独立演化。 -5. **分层系统**:通过层次化架构,使得客户端不需要了解整个系统的结构,只需与其交互的接口。 - -### 对REST的错误理解 - -1. **REST是一种协议**:实际上,REST是一种架构风格而不是协议。它基于HTTP协议,但并不限制于HTTP。虽然大多数RESTful API都使用HTTP作为通信协议,但它们也可以在其他协议上运行,如WebSocket。 - -2. **每个HTTP接口都是RESTful的**:即使一个API使用HTTP,并且使用了一些RESTful的理念,但并不意味着它就是真正的RESTful API。RESTful API需要遵循一系列约束条件,如无状态、统一接口等,而不仅仅是使用HTTP协议。 - -3. **URI中的动词表示操作**:RESTful API中,URI应该表示资源而不是操作。操作应该由HTTP方法来表示,例如GET用于获取资源,POST用于创建资源,PUT用于更新资源,DELETE用于删除资源。 - -4. **RESTful API需要使用所有的REST约束**:虽然RESTful API应该尽可能地遵循REST约束,但并不是所有的约束都适用于所有的情况。有时候根据实际情况做出权衡是可以接受的,例如在需要保持会话状态的应用中,无状态性约束可能无法完全实现。 -\ No newline at end of file \ No newline at end of file diff --git "a/\346\235\216\345\200\241\347\246\217/20240520-\345\210\233\345\273\272\351\246\226\344\270\252Api.md" "b/\346\235\216\345\200\241\347\246\217/20240520-\345\210\233\345\273\272\351\246\226\344\270\252Api.md" new file mode 100644 index 0000000..de896c2 --- /dev/null +++ "b/\346\235\216\345\200\241\347\246\217/20240520-\345\210\233\345\273\272\351\246\226\344\270\252Api.md" @@ -0,0 +1,25 @@ +## 创建首个Api + +1. 安装SDK + +2. Web的命令: + +- 新建一个WebApi项目:dotnet new webapi -n `命名` +- 新建一个解决方案:dotnet new sln -n `命名` +- 新建一个WebApi项目(--no -https参数表示不启用https):dotnet new webapi --no -https -o dream.WebApi +- 创建类库:dotnet new classlib -o `命名(dream.Entity)` + +3. 运行这个项目 +- dotnet run + +4. 在WeatherForecast.js中复制类名至导航栏,可看到数据 + +> 导航栏中localhost:端口/`swagger`可进入api的页面(CRUD) \ No newline at end of file diff --git "a/\346\235\216\345\200\241\347\246\217/20240521-\350\247\243\345\206\263\346\226\271\346\241\210\357\274\214\345\274\225\347\224\250\346\267\273\345\212\240\351\241\271\347\233\256.md" "b/\346\235\216\345\200\241\347\246\217/20240521-\350\247\243\345\206\263\346\226\271\346\241\210\357\274\214\345\274\225\347\224\250\346\267\273\345\212\240\351\241\271\347\233\256.md" new file mode 100644 index 0000000..6e74774 --- /dev/null +++ "b/\346\235\216\345\200\241\347\246\217/20240521-\350\247\243\345\206\263\346\226\271\346\241\210\357\274\214\345\274\225\347\224\250\346\267\273\345\212\240\351\241\271\347\233\256.md" @@ -0,0 +1,18 @@ +## 解决方案,引用添加项目 +### 创建解决方案的sln文件 +1. 创建的命令 +- dotnet new sln -n `命名` +2. 添加项目的命令 +- dotnet sln add `项目文件夹` + +### 文件之间的引用 +- dotnet add `引用位置` reference `被引用文件` + +### 添加依赖包 +- dotnet add package `包名` + +### 还原文件 +- dotnew restore/build(优先) + +### 将项目跑起来 +- dotnet watct/run --project `文件位置` diff --git "a/\346\235\216\345\200\241\347\246\217/20240523-api\346\212\275\347\246\273\343\200\201\350\275\254\346\215\242\343\200\201\344\276\235\350\265\226\346\263\250\345\205\245.md" "b/\346\235\216\345\200\241\347\246\217/20240523-api\346\212\275\347\246\273\343\200\201\350\275\254\346\215\242\343\200\201\344\276\235\350\265\226\346\263\250\345\205\245.md" new file mode 100644 index 0000000..53e07ae --- /dev/null +++ "b/\346\235\216\345\200\241\347\246\217/20240523-api\346\212\275\347\246\273\343\200\201\350\275\254\346\215\242\343\200\201\344\276\235\350\265\226\346\263\250\345\205\245.md" @@ -0,0 +1,59 @@ +## api抽离、转换、依赖注入 + +- Program +```cs +namespace Admin.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 Admin.api; + +public class Startup +{ + public void Configure(IApplicationBuilder app) + { + app.UseRouting(); + app.UseEndpoints(endpoints =>{ + endpoints.MapControllers(); + }); + } + + public void ConfigureServices(IServiceCollection services) + { + services.AddControllers(); + } +} +``` + +- BlogController +```cs +using Microsoft.AspNetCore.Mvc; + +namespace Admin.api; + +[Route("[controller]")] + +public class BlogsController:ControllerBase +{ + public IActionResult Index() + { + return Ok("会了吗???"); + } +} +``` \ No newline at end of file diff --git "a/\346\235\216\345\200\241\347\246\217/20240524-api\345\210\233\345\273\272\346\216\247\345\210\266\345\231\250.md" "b/\346\235\216\345\200\241\347\246\217/20240524-api\345\210\233\345\273\272\346\216\247\345\210\266\345\231\250.md" new file mode 100644 index 0000000..034aee7 --- /dev/null +++ "b/\346\235\216\345\200\241\347\246\217/20240524-api\345\210\233\345\273\272\346\216\247\345\210\266\345\231\250.md" @@ -0,0 +1,58 @@ +## api创建控制器 +- Program +```cs +namespace Admin.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 Admin.api; + +public class Startup +{ + public void Configure(IApplicationBuilder app) + { + app.UseRouting(); + app.UseEndpoints(endpoints =>{ + endpoints.MapControllers(); + }); + } + + public void ConfigureServices(IServiceCollection services) + { + services.AddControllers(); + } +} +``` + +- BlogController +```cs +using Microsoft.AspNetCore.Mvc; + +namespace Admin.api; + +[Route("[controller]")] + +public class BlogsController:ControllerBase +{ + public IActionResult Index() + { + return Ok("会了吗???"); + } +} +``` \ No newline at end of file -- Gitee